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}