Skip to main content

provenant/output_schema/
top_level_dependency.rs

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