Skip to main content

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