revoke_config/
format.rs

1use serde_json::Value;
2use std::path::Path;
3
4#[derive(Debug, Clone, Copy, PartialEq)]
5pub enum ConfigFormat {
6    Json,
7    Yaml,
8    Toml,
9}
10
11impl ConfigFormat {
12    pub fn parse(&self, content: &str) -> Result<Value, Box<dyn std::error::Error>> {
13        match self {
14            ConfigFormat::Json => {
15                let value: Value = serde_json::from_str(content)?;
16                Ok(value)
17            }
18            ConfigFormat::Yaml => {
19                let value: serde_yaml::Value = serde_yaml::from_str(content)?;
20                let json_str = serde_json::to_string(&value)?;
21                let json_value: Value = serde_json::from_str(&json_str)?;
22                Ok(json_value)
23            }
24            ConfigFormat::Toml => {
25                let value: toml::Value = toml::from_str(content)?;
26                let json_str = serde_json::to_string(&value)?;
27                let json_value: Value = serde_json::from_str(&json_str)?;
28                Ok(json_value)
29            }
30        }
31    }
32
33    pub fn serialize(&self, value: &Value) -> Result<String, Box<dyn std::error::Error>> {
34        match self {
35            ConfigFormat::Json => {
36                let content = serde_json::to_string_pretty(value)?;
37                Ok(content)
38            }
39            ConfigFormat::Yaml => {
40                let yaml_value: serde_yaml::Value = serde_yaml::from_str(&serde_json::to_string(value)?)?;
41                let content = serde_yaml::to_string(&yaml_value)?;
42                Ok(content)
43            }
44            ConfigFormat::Toml => {
45                let toml_value: toml::Value = serde_json::from_str(&serde_json::to_string(value)?)?;
46                let content = toml::to_string_pretty(&toml_value)?;
47                Ok(content)
48            }
49        }
50    }
51}
52
53pub fn detect_format(path: &Path) -> Option<ConfigFormat> {
54    let extension = path.extension()?.to_str()?;
55    match extension.to_lowercase().as_str() {
56        "json" => Some(ConfigFormat::Json),
57        "yaml" | "yml" => Some(ConfigFormat::Yaml),
58        "toml" => Some(ConfigFormat::Toml),
59        _ => None,
60    }
61}