provenant/output_schema/
dependency.rs1use 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}