provenant/output_schema/
top_level_dependency.rs1use 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 OutputTopLevelDependency {
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 pub dependency_uid: String,
20 pub for_package_uid: Option<String>,
21 pub datafile_path: String,
22 pub datasource_id: crate::models::DatasourceId,
23 pub namespace: Option<String>,
24}
25
26impl From<&crate::models::TopLevelDependency> for OutputTopLevelDependency {
27 fn from(value: &crate::models::TopLevelDependency) -> Self {
28 Self {
29 purl: value.purl.clone(),
30 extracted_requirement: value.extracted_requirement.clone(),
31 scope: value.scope.clone(),
32 is_runtime: value.is_runtime,
33 is_optional: value.is_optional,
34 is_pinned: value.is_pinned,
35 is_direct: value.is_direct,
36 resolved_package: value
37 .resolved_package
38 .as_ref()
39 .map(|rp| Box::new(OutputResolvedPackage::from(rp.as_ref()))),
40 extra_data: value.extra_data.clone(),
41 dependency_uid: value.dependency_uid.to_string(),
42 for_package_uid: value.for_package_uid.as_ref().map(|uid| uid.to_string()),
43 datafile_path: value.datafile_path.clone(),
44 datasource_id: value.datasource_id,
45 namespace: value.namespace.clone(),
46 }
47 }
48}
49
50impl TryFrom<&OutputTopLevelDependency> for crate::models::TopLevelDependency {
51 type Error = String;
52 fn try_from(value: &OutputTopLevelDependency) -> Result<Self, Self::Error> {
53 let resolved_package = value
54 .resolved_package
55 .as_ref()
56 .map(|rp| crate::models::ResolvedPackage::try_from(rp.as_ref()).map(Box::new))
57 .transpose()?;
58 Ok(Self {
59 purl: value.purl.clone(),
60 extracted_requirement: value.extracted_requirement.clone(),
61 scope: value.scope.clone(),
62 is_runtime: value.is_runtime,
63 is_optional: value.is_optional,
64 is_pinned: value.is_pinned,
65 is_direct: value.is_direct,
66 resolved_package,
67 extra_data: value.extra_data.clone(),
68 dependency_uid: crate::models::DependencyUid::from_raw(value.dependency_uid.clone()),
69 for_package_uid: value
70 .for_package_uid
71 .as_ref()
72 .map(|s| crate::models::PackageUid::from_raw(s.clone())),
73 datafile_path: value.datafile_path.clone(),
74 datasource_id: value.datasource_id,
75 namespace: value.namespace.clone(),
76 })
77 }
78}