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}