Skip to main content

provenant/output_schema/
top_level_dependency.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use super::resolved_package::OutputResolvedPackage;
5use super::serde_helpers::serialize_optional_map_as_object;
6
7#[derive(Serialize, Deserialize, Debug, Clone)]
8pub struct OutputTopLevelDependency {
9    pub purl: Option<String>,
10    pub extracted_requirement: Option<String>,
11    pub scope: Option<String>,
12    pub is_runtime: Option<bool>,
13    pub is_optional: Option<bool>,
14    pub is_pinned: Option<bool>,
15    pub is_direct: Option<bool>,
16    pub resolved_package: Option<Box<OutputResolvedPackage>>,
17    #[serde(default, serialize_with = "serialize_optional_map_as_object")]
18    pub extra_data: Option<HashMap<String, serde_json::Value>>,
19    pub dependency_uid: String,
20    pub for_package_uid: Option<String>,
21    pub datafile_path: String,
22    pub datasource_id: crate::models::DatasourceId,
23    pub namespace: Option<String>,
24}
25
26impl From<&crate::models::TopLevelDependency> for OutputTopLevelDependency {
27    fn from(value: &crate::models::TopLevelDependency) -> Self {
28        Self {
29            purl: value.purl.clone(),
30            extracted_requirement: value.extracted_requirement.clone(),
31            scope: value.scope.clone(),
32            is_runtime: value.is_runtime,
33            is_optional: value.is_optional,
34            is_pinned: value.is_pinned,
35            is_direct: value.is_direct,
36            resolved_package: value
37                .resolved_package
38                .as_ref()
39                .map(|rp| Box::new(OutputResolvedPackage::from(rp.as_ref()))),
40            extra_data: value.extra_data.clone(),
41            dependency_uid: value.dependency_uid.to_string(),
42            for_package_uid: value.for_package_uid.as_ref().map(|uid| uid.to_string()),
43            datafile_path: value.datafile_path.clone(),
44            datasource_id: value.datasource_id,
45            namespace: value.namespace.clone(),
46        }
47    }
48}
49
50impl TryFrom<&OutputTopLevelDependency> for crate::models::TopLevelDependency {
51    type Error = String;
52    fn try_from(value: &OutputTopLevelDependency) -> Result<Self, Self::Error> {
53        let resolved_package = value
54            .resolved_package
55            .as_ref()
56            .map(|rp| crate::models::ResolvedPackage::try_from(rp.as_ref()).map(Box::new))
57            .transpose()?;
58        Ok(Self {
59            purl: value.purl.clone(),
60            extracted_requirement: value.extracted_requirement.clone(),
61            scope: value.scope.clone(),
62            is_runtime: value.is_runtime,
63            is_optional: value.is_optional,
64            is_pinned: value.is_pinned,
65            is_direct: value.is_direct,
66            resolved_package,
67            extra_data: value.extra_data.clone(),
68            dependency_uid: crate::models::DependencyUid::from_raw(value.dependency_uid.clone()),
69            for_package_uid: value
70                .for_package_uid
71                .as_ref()
72                .map(|s| crate::models::PackageUid::from_raw(s.clone())),
73            datafile_path: value.datafile_path.clone(),
74            datasource_id: value.datasource_id,
75            namespace: value.namespace.clone(),
76        })
77    }
78}