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