ligen_ir/library/metadata/
dependency.rs

1use 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
12// TODO: This has become Python-centric. We need to move it to a parser logic.
13impl 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}