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 }
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#[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 pub(crate) name: String,
53 pub(crate) version: Versioning,
55 pub(crate) package: PackageDetails,
57 pub(crate) location: PathBuf,
59 pub(crate) include_path: PathBuf,
61 pub(crate) hash: String,
63 pub(crate) dependencies: Vec<DependencyTreeNode>,
65 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}