use semver::Version; use serde::{Deserialize, Serialize}; use crate::package::PackageHandler; /// Data struct #[derive(Debug, Clone, Deserialize, Serialize, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct Dependency { name: String, #[serde(skip_serializing_if = ">::is_none")] version: Option, pub checksum: String, #[serde(skip_serializing_if = ">::is_none")] source: Option, // Path / URL } impl Dependency { /// Returns a path to the dependency in local storage /// if there is one. pub fn local_path(&self) -> String { if self.source.as_ref().is_some_and(|path| !is_url(path)) { return self.source.clone().unwrap(); } // TODO: Convert from reverse domain name to path. return self.name.clone(); } pub fn is_updated(&self) -> crate::Result { // If the path is local and that file has not been updated. Ok(self.source.as_ref().is_some_and(|path| is_url(path)) && self.checksum == sha256::try_digest(self.source.as_ref().unwrap())?) } } impl From for Dependency { fn from(value: PackageHandler) -> Self { Dependency { name: value.name(), version: Some(value.version()), checksum: String::new(), source: None, } } } /// TODO: This is just a placeholder at present. fn is_url(_path: S) -> bool { return false; }