provenant-cli 0.1.3

Independent Rust scanner for ScanCode-compatible workflows, licenses, package metadata, SBOMs, and provenance data.
Documentation
// SPDX-FileCopyrightText: Provenant contributors
// SPDX-License-Identifier: Apache-2.0

use serde::{Deserialize, Serialize};
use std::collections::HashMap;

use super::resolved_package::OutputResolvedPackage;
use super::serde_helpers::serialize_optional_map_as_object;

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OutputDependency {
    pub purl: Option<String>,
    pub extracted_requirement: Option<String>,
    pub scope: Option<String>,
    pub is_runtime: Option<bool>,
    pub is_optional: Option<bool>,
    pub is_pinned: Option<bool>,
    pub is_direct: Option<bool>,
    pub resolved_package: Option<Box<OutputResolvedPackage>>,
    #[serde(default, serialize_with = "serialize_optional_map_as_object")]
    pub extra_data: Option<HashMap<String, serde_json::Value>>,
}

impl From<&crate::models::Dependency> for OutputDependency {
    fn from(value: &crate::models::Dependency) -> Self {
        Self {
            purl: value.purl.clone(),
            extracted_requirement: value.extracted_requirement.clone(),
            scope: value.scope.clone(),
            is_runtime: value.is_runtime,
            is_optional: value.is_optional,
            is_pinned: value.is_pinned,
            is_direct: value.is_direct,
            resolved_package: value
                .resolved_package
                .as_ref()
                .map(|rp| Box::new(OutputResolvedPackage::from(rp.as_ref()))),
            extra_data: value.extra_data.clone(),
        }
    }
}

impl TryFrom<&OutputDependency> for crate::models::Dependency {
    type Error = String;
    fn try_from(value: &OutputDependency) -> Result<Self, Self::Error> {
        let resolved_package = value
            .resolved_package
            .as_ref()
            .map(|rp| crate::models::ResolvedPackage::try_from(rp.as_ref()).map(Box::new))
            .transpose()?;
        Ok(Self {
            purl: value.purl.clone(),
            extracted_requirement: value.extracted_requirement.clone(),
            scope: value.scope.clone(),
            is_runtime: value.is_runtime,
            is_optional: value.is_optional,
            is_pinned: value.is_pinned,
            is_direct: value.is_direct,
            resolved_package,
            extra_data: value.extra_data.clone(),
        })
    }
}