From 3850a83d459a3816588be120727445a88e11ff60 Mon Sep 17 00:00:00 2001 From: louib Date: Tue, 22 Aug 2023 21:09:07 -0400 Subject: [PATCH] feat: add license support --- src/cyclone_dx.rs | 32 +++++++++++++++++++++++++++++++- src/nix.rs | 11 +++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/cyclone_dx.rs b/src/cyclone_dx.rs index 78e6b90..91a8458 100644 --- a/src/cyclone_dx.rs +++ b/src/cyclone_dx.rs @@ -5,7 +5,8 @@ use serde::{de::Deserialize, ser::Serialize}; use serde_cyclonedx::cyclonedx::v_1_4::{ Commit, CommitBuilder, Component, ComponentBuilder, ComponentPedigree, ComponentPedigreeBuilder, - CycloneDxBuilder, ExternalReference, ExternalReferenceBuilder, Metadata, ToolBuilder, + CycloneDxBuilder, ExternalReference, ExternalReferenceBuilder, License, LicenseBuilder, LicenseChoice, + Metadata, ToolBuilder, }; const CURRENT_SPEC_VERSION: &str = "1.4"; @@ -118,5 +119,34 @@ pub fn dump_derivation(derivation_path: &str, package_node: &crate::nix::Package ); } + let mut licenses: Vec = vec![]; + for license in &package_node.package.meta.get_licenses() { + match license { + crate::nix::PackageLicense::Name(n) => { + licenses.push(LicenseChoice { + expression: Some(n.to_string()), + license: None, + }); + } + crate::nix::PackageLicense::Details(license_details) => { + let mut license_builder = LicenseBuilder::default(); + match &license_details.spdx_id { + None => continue, + Some(id) => license_builder.id(id), + }; + if let Some(full_name) = &license_details.full_name { + license_builder.name(full_name); + } + licenses.push(LicenseChoice { + expression: None, + license: Some(license_builder.build().unwrap()), + }); + } + } + } + if licenses.len() != 0 { + component_builder.licenses(licenses); + } + Some(component_builder.build().unwrap()) } diff --git a/src/nix.rs b/src/nix.rs index b8a4799..8d92cf6 100644 --- a/src/nix.rs +++ b/src/nix.rs @@ -251,8 +251,14 @@ pub struct PackageMeta { pub license: Option, } impl PackageMeta { - pub fn get_licenses(&self) -> Vec { - vec![] + pub fn get_licenses(&self) -> Vec { + match &self.license { + Some(h) => match h { + License::One(license) => vec![license.clone()], + License::Many(licenses) => licenses.clone(), + }, + None => vec![], + } } pub fn get_homepages(&self) -> Vec { match &self.homepage { @@ -316,6 +322,7 @@ pub enum PackageLicense { } #[derive(Debug)] +#[derive(Default)] #[derive(Clone)] #[derive(Deserialize)] pub struct LicenseDetails {