openfare_lib/extension/
common.rs

1use anyhow::Result;
2
3#[derive(
4    Debug, Clone, Hash, Eq, PartialEq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
5)]
6pub struct VersionError(String);
7
8impl VersionError {
9    pub fn from_missing_version() -> Self {
10        Self("Missing version number".to_string())
11    }
12
13    pub fn from_parse_error(raw_version_number: &str) -> Self {
14        Self(format!("Version parse error: {}", raw_version_number))
15    }
16
17    pub fn message(&self) -> String {
18        self.0.clone()
19    }
20}
21
22pub type VersionParseResult = std::result::Result<String, VersionError>;
23
24/// A dependency as specified within a dependencies definition file.
25#[derive(
26    Clone, Debug, Hash, Eq, PartialEq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
27)]
28pub struct Dependency {
29    pub name: String,
30    pub version: VersionParseResult,
31}
32
33pub trait DependenciesCollection: Sized {
34    fn registry_host_name(&self) -> &String;
35    fn dependencies(&self) -> &Vec<Dependency>;
36}
37
38/// Package dependencies found by querying a registry.
39#[derive(Clone, Debug, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
40pub struct PackageDependencies {
41    // Package version (included incase version not given as an argument).
42    pub package_version: VersionParseResult,
43
44    /// Dependencies registry host name.
45    pub registry_host_name: String,
46
47    /// Dependencies specified within the dependencies specification file.
48    pub dependencies: Vec<Dependency>,
49}
50
51impl DependenciesCollection for PackageDependencies {
52    fn registry_host_name(&self) -> &String {
53        &self.registry_host_name
54    }
55    fn dependencies(&self) -> &Vec<Dependency> {
56        &self.dependencies
57    }
58}
59
60/// A dependencies specification file found from inspecting the local filesystem.
61#[derive(Clone, Debug, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
62pub struct FileDefinedDependencies {
63    /// Absolute file path for dependencies specification file.
64    pub path: std::path::PathBuf,
65
66    /// Dependencies registry host name.
67    pub registry_host_name: String,
68
69    /// Dependencies specified within the dependencies specification file.
70    pub dependencies: Vec<Dependency>,
71}
72
73impl DependenciesCollection for FileDefinedDependencies {
74    fn registry_host_name(&self) -> &String {
75        &self.registry_host_name
76    }
77    fn dependencies(&self) -> &Vec<Dependency> {
78        &self.dependencies
79    }
80}
81
82#[derive(Debug, Clone, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
83pub struct RegistryPackageMetadata {
84    pub registry_host_name: String,
85    pub human_url: String,
86    pub artifact_url: String,
87    // True if this registry is the primary registry, otherwise false.
88    pub is_primary: bool,
89    // Included here incase package version was not given but found.
90    pub package_version: String,
91}
92
93pub trait FromLib: Extension + Send + Sync {
94    /// Initialize extension from a library.
95    fn new() -> Self
96    where
97        Self: Sized;
98}
99
100pub trait FromProcess: Extension + Send + Sync {
101    /// Initialize extension from a process.
102    fn from_process(
103        process_path: &std::path::PathBuf,
104        extension_config_path: &std::path::PathBuf,
105    ) -> Result<Self>
106    where
107        Self: Sized;
108}
109
110pub trait Extension: Send + Sync {
111    // Returns extension short name.
112    fn name(&self) -> String;
113
114    // Returns supported registries host names.
115    fn registries(&self) -> Vec<String>;
116
117    // Returns extension version.
118    fn version(&self) -> String;
119
120    /// Returns OpenFare locks for a package and its dependencies.
121    fn package_dependencies_locks(
122        &self,
123        package_name: &str,
124        package_version: &Option<&str>,
125        extension_args: &Vec<String>,
126    ) -> Result<super::commands::package_dependencies_locks::PackageDependenciesLocks>;
127
128    /// Return OpenFare locks for a local project's dependencies.
129    fn project_dependencies_locks(
130        &self,
131        working_directory: &std::path::PathBuf,
132        extension_args: &Vec<String>,
133    ) -> Result<super::commands::project_dependencies_locks::ProjectDependenciesLocks>;
134}