summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main.rs1
-rw-r--r--src/source/mod.rs81
2 files changed, 82 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
index 425ad2f..9eadec5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -22,6 +22,7 @@ mod package;
mod phase;
mod repository;
mod schema;
+mod source;
mod ui;
mod util;
diff --git a/src/source/mod.rs b/src/source/mod.rs
new file mode 100644
index 0000000..e88fd60
--- /dev/null
+++ b/src/source/mod.rs
@@ -0,0 +1,81 @@
+use std::path::PathBuf;
+
+use anyhow::Result;
+use anyhow::Error;
+
+use crate::package::Package;
+use crate::package::PackageName;
+use crate::package::PackageVersion;
+use crate::package::Source;
+
+pub struct SourceCache {
+ root: PathBuf,
+}
+
+impl SourceCache {
+ pub fn new(root: PathBuf) -> Self {
+ SourceCache { root }
+ }
+
+ pub fn source_for(&self, p: &Package) -> SourceEntry {
+ SourceEntry::for_package(self.root.clone(), p)
+ }
+}
+
+pub struct SourceEntry {
+ cache_root: PathBuf,
+ package_name: PackageName,
+ package_version: PackageVersion,
+ package_source: Source,
+ package_source_path: PathBuf,
+}
+
+impl SourceEntry {
+
+ fn for_package(cache_root: PathBuf, package: &Package) -> Self {
+ let package_source_path = cache_root.join(format!("{}-{}.source", package.name(), package.version()));
+
+ SourceEntry {
+ cache_root,
+ package_name: package.name().clone(),
+ package_version: package.version().clone(),
+ package_source: package.source().clone(),
+ package_source_path
+ }
+ }
+
+ pub fn exists(&self) -> bool {
+ self.package_source_path.exists()
+ }
+
+ pub fn path(&self) -> &PathBuf {
+ &self.package_source_path
+ }
+
+ pub async fn verify_hash(&self) -> Result<bool> {
+ use tokio::io::AsyncReadExt;
+
+ let mut buf = vec![];
+ tokio::fs::OpenOptions::new()
+ .create(false)
+ .create_new(false)
+ .read(true)
+ .open(&self.package_source_path)
+ .await?
+ .read_to_end(&mut buf)
+ .await?;
+
+ self.package_source.hash().matches_hash_of(&buf)
+ }
+
+ pub async fn open(&self) -> Result<tokio::fs::File> {
+ tokio::fs::OpenOptions::new()
+ .create(false)
+ .create_new(false)
+ .read(true)
+ .open(&self.package_source_path)
+ .await
+ .map_err(Error::from)
+ }
+
+}