ligen_ir/library/metadata/
dependency.rs1use regex::Regex;
2
3use crate::{prelude::*, VersionRequirement, Identifier};
4
5#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub struct Dependency {
7 pub identifier: Identifier,
8 pub requirement: VersionRequirement,
9 pub feature: Option<Identifier>,
10}
11
12impl TryFrom<&str> for Dependency {
14 type Error = Error;
15 fn try_from(value: &str) -> Result<Self> {
16 let value = value.trim();
17 let mut values = value.split(';');
18 let value = values.next().unwrap_or(value);
19 let feature = values.next().and_then(|v| {
20 Regex::new(r"extra\s*==\s*'([^']*)'")
21 .unwrap()
22 .captures(v)
23 .map(|c| Identifier::from(c.get(1).unwrap().as_str()))
24 });
25 let regex = regex::Regex::new(r"(==|>=|<=|>|<)").map_err(|e| format!("{:?}", e))?;
26 let mut parts = regex.split(value);
27 let identifier = Identifier::from(parts.next().ok_or("Failed to get identifier.")?);
28 let rest = parts.collect::<Vec<_>>().join(" ");
29 let requirement = VersionRequirement::from(rest.as_str());
30 Ok(Self { identifier, requirement, feature })
31 }
32}