@@ -11,6 +11,15 @@ const NAMESPACE: Uuid = Uuid::from_bytes([
1111 0xde , 0xad , 0xbe , 0xef , 0xca , 0xfe , 0x41 , 0x18 , 0xa1 , 0x38 , 0xb8 , 0x9f , 0x19 , 0x35 , 0xe0 , 0xa7 ,
1212] ) ;
1313
14+ /// SPDX license information extracted from an SPDX expression
15+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
16+ pub struct SPDXInfo {
17+ pub spdx_licenses : Vec < String > ,
18+ pub spdx_license_exceptions : Vec < String > ,
19+ pub custom_license_refs : Vec < String > ,
20+ pub custom_document_license_refs : Vec < String > ,
21+ }
22+
1423#[ derive( Default , Debug , Clone , PartialEq , Eq ) ]
1524pub struct LicenseInfo {
1625 pub license : String ,
@@ -22,7 +31,7 @@ impl LicenseInfo {
2231 Uuid :: new_v5 ( & NAMESPACE , self . license . to_lowercase ( ) . as_bytes ( ) )
2332 }
2433
25- pub fn spdx_info ( & self ) -> ( Vec < String > , Vec < String > , Vec < String > , Vec < String > ) {
34+ pub fn spdx_info ( & self ) -> SPDXInfo {
2635 SpdxExpression :: parse ( & self . license )
2736 . map ( |parsed| {
2837 let spdx_licenses = parsed
@@ -62,14 +71,19 @@ impl LicenseInfo {
6271 } )
6372 . collect :: < Vec < _ > > ( ) ;
6473
65- (
74+ SPDXInfo {
6675 spdx_licenses,
6776 spdx_license_exceptions,
6877 custom_license_refs,
6978 custom_document_license_refs,
70- )
79+ }
80+ } )
81+ . unwrap_or ( SPDXInfo {
82+ spdx_licenses : vec ! [ ] ,
83+ spdx_license_exceptions : vec ! [ ] ,
84+ custom_license_refs : vec ! [ ] ,
85+ custom_document_license_refs : vec ! [ ] ,
7186 } )
72- . unwrap_or ( ( vec ! [ ] , vec ! [ ] , vec ! [ ] , vec ! [ ] ) )
7387 }
7488}
7589
@@ -81,37 +95,41 @@ pub struct LicenseCreator {
8195 /// database.
8296 pub licenses : BTreeMap < Uuid , license:: ActiveModel > ,
8397
84- pub custom_license_list : Vec < licensing_infos:: ActiveModel > ,
98+ /// Custom license lookup map: license_id -> name
99+ custom_license_map : std:: collections:: HashMap < String , String > ,
85100}
86101
87102impl LicenseCreator {
88103 pub fn new ( ) -> Self {
89104 Self {
90105 licenses : Default :: default ( ) ,
91- custom_license_list : vec ! [ ] ,
106+ custom_license_map : std :: collections :: HashMap :: new ( ) ,
92107 }
93108 }
94109
95110 pub fn put_custom_license_list (
96111 & mut self ,
97112 custom_license_list : Vec < licensing_infos:: ActiveModel > ,
98113 ) {
99- self . custom_license_list = custom_license_list;
114+ self . custom_license_map = custom_license_list
115+ . into_iter ( )
116+ . filter_map ( |c| {
117+ if let ( Set ( license_id) , Set ( name) ) = ( & c. license_id , & c. name ) {
118+ Some ( ( license_id. clone ( ) , name. clone ( ) ) )
119+ } else {
120+ None
121+ }
122+ } )
123+ . collect ( ) ;
100124 }
101125
102126 pub fn add ( & mut self , info : & LicenseInfo ) {
103127 let uuid = info. uuid ( ) ;
104128
105- let ( spdx_licenses, spdx_exceptions, custom_license_refs, custom_document_license_refs) =
106- info. spdx_info ( ) ;
107- let missing_custom_refs: Vec < _ > = custom_license_refs
129+ let spdx_info = info. spdx_info ( ) ;
130+ let missing_custom_refs: Vec < _ > = spdx_info. custom_license_refs
108131 . iter ( )
109- . filter ( |ref_id| {
110- !self
111- . custom_license_list
112- . iter ( )
113- . any ( |c| c. license_id == Set ( ( * ref_id) . to_string ( ) ) )
114- } )
132+ . filter ( |ref_id| !self . custom_license_map . contains_key ( * ref_id) )
115133 . cloned ( )
116134 . collect ( ) ;
117135 if !missing_custom_refs. is_empty ( ) {
@@ -120,51 +138,42 @@ impl LicenseCreator {
120138 missing_custom_refs
121139 ) ;
122140 }
123- let custom_license_refs_value = if custom_license_refs. is_empty ( ) {
141+ let custom_license_refs_value = if spdx_info . custom_license_refs . is_empty ( ) {
124142 None
125143 } else {
126- Some ( self . construct_custom_license ( custom_license_refs. clone ( ) ) )
144+ Some ( self . construct_custom_license ( spdx_info . custom_license_refs . clone ( ) ) )
127145 } ;
128146
129147 self . licenses . entry ( uuid) . or_insert ( license:: ActiveModel {
130148 id : Set ( uuid) ,
131149 text : Set ( info. license . clone ( ) ) ,
132- spdx_licenses : if spdx_licenses. is_empty ( ) {
150+ spdx_licenses : if spdx_info . spdx_licenses . is_empty ( ) {
133151 Set ( None )
134152 } else {
135- Set ( Some ( spdx_licenses) )
153+ Set ( Some ( spdx_info . spdx_licenses ) )
136154 } ,
137- spdx_license_exceptions : if spdx_exceptions . is_empty ( ) {
155+ spdx_license_exceptions : if spdx_info . spdx_license_exceptions . is_empty ( ) {
138156 Set ( None )
139157 } else {
140- Set ( Some ( spdx_exceptions ) )
158+ Set ( Some ( spdx_info . spdx_license_exceptions ) )
141159 } ,
142160 custom_license_refs : Set ( custom_license_refs_value) ,
143- custom_document_license_refs : if custom_document_license_refs. is_empty ( ) {
161+ custom_document_license_refs : if spdx_info . custom_document_license_refs . is_empty ( ) {
144162 Set ( None )
145163 } else {
146- Set ( Some ( custom_document_license_refs) )
164+ Set ( Some ( spdx_info . custom_document_license_refs ) )
147165 } ,
148166 } ) ;
149167 }
150168
151169 fn construct_custom_license ( & self , custom_license_ids : Vec < String > ) -> Vec < String > {
152- use std:: collections:: HashMap ;
153- // Build a HashMap from license_id to name for fast lookup
154- let license_map: HashMap < & String , & String > = self
155- . custom_license_list
156- . iter ( )
157- . filter_map ( |c| {
158- if let ( Set ( license_id) , Set ( name) ) = ( & c. license_id , & c. name ) {
159- Some ( ( license_id, name) )
160- } else {
161- None
162- }
163- } )
164- . collect ( ) ;
165170 custom_license_ids
166171 . into_iter ( )
167- . filter_map ( |id| license_map. get ( & id) . map ( |name| format ! ( "{}:{}" , id, name) ) )
172+ . filter_map ( |id| {
173+ self . custom_license_map
174+ . get ( & id)
175+ . map ( |name| format ! ( "{}:{}" , id, name) )
176+ } )
168177 . collect ( )
169178 }
170179
0 commit comments