provenant/output_schema/
top_level_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 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}