Skip to main content

soar_db/models/
types.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Deserialize, Serialize)]
4pub enum ProvideStrategy {
5    KeepTargetOnly,
6    KeepBoth,
7    Alias,
8}
9
10impl std::fmt::Display for ProvideStrategy {
11    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12        let msg = match self {
13            ProvideStrategy::KeepTargetOnly => "=>",
14            ProvideStrategy::KeepBoth => "==",
15            ProvideStrategy::Alias => ":",
16        };
17        write!(f, "{msg}")
18    }
19}
20
21#[derive(Debug, Default, Deserialize, Serialize, Clone)]
22pub struct PackageProvide {
23    pub name: String,
24    pub target: Option<String>,
25    pub strategy: Option<ProvideStrategy>,
26}
27
28impl PackageProvide {
29    pub fn from_string(provide: &str) -> Self {
30        if let Some((name, target_name)) = provide.split_once("==") {
31            Self {
32                name: name.to_string(),
33                target: Some(target_name.to_string()),
34                strategy: Some(ProvideStrategy::KeepBoth),
35            }
36        } else if let Some((name, target_name)) = provide.split_once("=>") {
37            Self {
38                name: name.to_string(),
39                target: Some(target_name.to_string()),
40                strategy: Some(ProvideStrategy::KeepTargetOnly),
41            }
42        } else if let Some((name, target_name)) = provide.split_once(":") {
43            Self {
44                name: name.to_string(),
45                target: Some(target_name.to_string()),
46                strategy: Some(ProvideStrategy::Alias),
47            }
48        } else {
49            Self {
50                name: provide.to_string(),
51                target: None,
52                strategy: None,
53            }
54        }
55    }
56}