liblingo/package/
tree.rs

1use serde::{Deserialize, Serialize};
2use url::Url;
3use versions::{Requirement, Versioning};
4
5use std::path::PathBuf;
6
7use crate::package::target_properties::LibraryTargetProperties;
8
9#[derive(Clone, Deserialize, Serialize, Debug)]
10pub enum ProjectSource {
11    #[serde(rename = "git")]
12    Git(Url),
13    #[serde(rename = "tarball")]
14    TarBall(Url),
15    #[serde(rename = "path")]
16    Path(PathBuf),
17    //#[serde(rename = "empty")]
18    //Empty,
19}
20
21#[derive(Serialize, Deserialize, Clone, Debug)]
22pub enum GitLock {
23    #[serde(rename = "tag")]
24    Tag(String),
25
26    #[serde(rename = "branch")]
27    Branch(String),
28
29    #[serde(rename = "rev")]
30    Rev(String),
31}
32
33/// Dependency with source and version
34#[derive(Clone, Deserialize, Serialize, Debug)]
35pub struct PackageDetails {
36    #[serde(
37        deserialize_with = "Requirement::deserialize",
38        serialize_with = "Requirement::serialize"
39    )]
40    pub(crate) version: Requirement,
41    #[serde(flatten)]
42    pub(crate) mutual_exclusive: ProjectSource,
43    #[serde(flatten)]
44    pub(crate) git_tag: Option<GitLock>,
45    #[serde(skip)]
46    pub(crate) git_rev: Option<String>,
47}
48
49#[derive(Clone, Debug)]
50pub struct DependencyTreeNode {
51    /// Name of this Package
52    pub(crate) name: String,
53    /// version specified in the Lingo.toml
54    pub(crate) version: Versioning,
55    /// source of this package
56    pub(crate) package: PackageDetails,
57    /// location of where the packed has been cloned to
58    pub(crate) location: PathBuf,
59    /// relative path inside the package where the to include contents live
60    pub(crate) include_path: PathBuf,
61    /// hash of the package
62    pub(crate) hash: String,
63    /// required dependencies to build this package
64    pub(crate) dependencies: Vec<DependencyTreeNode>,
65    /// required dependencies to build this package
66    pub(crate) properties: LibraryTargetProperties,
67}
68
69impl DependencyTreeNode {
70    pub fn shallow_clone(&self) -> Self {
71        Self {
72            name: self.name.clone(),
73            version: self.version.clone(),
74            package: self.package.clone(),
75            location: self.location.clone(),
76            include_path: self.include_path.clone(),
77            hash: self.hash.clone(),
78            dependencies: Vec::new(),
79            properties: Default::default(),
80        }
81    }
82
83    pub fn aggregate(&self) -> Vec<DependencyTreeNode> {
84        let mut aggregator = vec![self.shallow_clone()];
85
86        for dependency in &self.dependencies {
87            let mut aggregation = dependency.aggregate();
88            aggregator.append(&mut aggregation);
89        }
90
91        aggregator
92    }
93}