scancode_rust/utils/
spdx.rs1use std::collections::HashSet;
2
3pub fn combine_license_expressions(expressions: impl IntoIterator<Item = String>) -> Option<String> {
6 let unique_expressions: HashSet<String> = expressions.into_iter().collect();
7 if unique_expressions.is_empty() {
8 return None;
9 }
10
11 let mut sorted_expressions: Vec<String> = unique_expressions.into_iter().collect();
12 sorted_expressions.sort(); let combined = sorted_expressions
16 .iter()
17 .map(|expr| {
18 if expr.contains(' ') && !(expr.starts_with('(') && expr.ends_with(')')) {
21 format!("({})", expr)
22 } else {
23 expr.clone()
24 }
25 })
26 .collect::<Vec<_>>()
27 .join(" AND ");
28
29 Some(combined)
30}