use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum License {
Apache(String),
MIT,
GPL(String),
LGPL(String),
AGPL(String),
MPL(String),
BSD(String),
CC0,
ISC,
Custom(String),
#[default]
Unknown,
}
impl From<&str> for License {
fn from(value: &str) -> Self {
match value.to_lowercase().as_str() {
value if value.contains("apache") => License::Apache(split_or_default(value, "-")),
value if value.contains("mit") => License::MIT,
value if value.starts_with("gpl") => License::GPL(split_or_default(value, "-")),
value if value.starts_with("lgpl") => License::LGPL(split_or_default(value, "-")),
value if value.starts_with("agpl") => License::AGPL(split_or_default(value, "-")),
value if value.starts_with("mpl") => License::MPL(split_or_default(value, "-")),
value if value.starts_with("bsd") => License::BSD(split_or_default(value, "-")),
"cc0" => License::CC0,
"isc" => License::ISC,
_ => License::Custom(String::from(value)),
}
}
}
fn split_or_default(value: &str, sep: &str) -> String {
if let Some((_, version)) = value.split_once(sep) {
String::from(version.trim())
} else {
String::from(value)
}
}
impl From<String> for License {
fn from(value: String) -> Self {
License::from(value.as_str())
}
}
#[cfg(test)]
mod tests {
use super::License;
#[test]
fn test_license_from_str() {
let license = License::from("Apache-2.0");
assert_eq!(license, License::Apache(String::from("2.0")));
}
#[test]
fn test_license_versions() {
let license = License::from("GPL-3.0");
assert_eq!(license, License::GPL(String::from("3.0")));
let license = License::from("AGPL-3.0");
assert_eq!(license, License::AGPL(String::from("3.0")));
let license = License::from("MPL-3.0");
assert_eq!(license, License::MPL(String::from("3.0")));
}
#[test]
fn test_split_or_default() {
let license = super::split_or_default("Apache-2.0", "-");
assert_eq!(license, "2.0");
let license = super::split_or_default("MIT", "-");
assert_eq!(license, "MIT");
}
}