Skip to main content

provenant/output_schema/
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 OutputDependency {
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}
23
24impl From<&crate::models::Dependency> for OutputDependency {
25    fn from(value: &crate::models::Dependency) -> Self {
26        Self {
27            purl: value.purl.clone(),
28            extracted_requirement: value.extracted_requirement.clone(),
29            scope: value.scope.clone(),
30            is_runtime: value.is_runtime,
31            is_optional: value.is_optional,
32            is_pinned: value.is_pinned,
33            is_direct: value.is_direct,
34            resolved_package: value
35                .resolved_package
36                .as_ref()
37                .map(|rp| Box::new(OutputResolvedPackage::from(rp.as_ref()))),
38            extra_data: value.extra_data.clone(),
39        }
40    }
41}
42
43impl TryFrom<&OutputDependency> for crate::models::Dependency {
44    type Error = String;
45    fn try_from(value: &OutputDependency) -> Result<Self, Self::Error> {
46        let resolved_package = value
47            .resolved_package
48            .as_ref()
49            .map(|rp| crate::models::ResolvedPackage::try_from(rp.as_ref()).map(Box::new))
50            .transpose()?;
51        Ok(Self {
52            purl: value.purl.clone(),
53            extracted_requirement: value.extracted_requirement.clone(),
54            scope: value.scope.clone(),
55            is_runtime: value.is_runtime,
56            is_optional: value.is_optional,
57            is_pinned: value.is_pinned,
58            is_direct: value.is_direct,
59            resolved_package,
60            extra_data: value.extra_data.clone(),
61        })
62    }
63}