Skip to main content

synaptic_config/
format.rs

1use std::path::Path;
2
3use serde::de::DeserializeOwned;
4use synaptic_core::SynapticError;
5
6/// Supported configuration file formats.
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum ConfigFormat {
9    Toml,
10    Json,
11    Yaml,
12}
13
14impl ConfigFormat {
15    /// Detect format from a file extension string (e.g. "toml", "json", "yaml", "yml").
16    pub fn from_extension(ext: &str) -> Option<Self> {
17        match ext.to_ascii_lowercase().as_str() {
18            "toml" => Some(Self::Toml),
19            "json" => Some(Self::Json),
20            "yaml" | "yml" => Some(Self::Yaml),
21            _ => None,
22        }
23    }
24
25    /// Detect format from a file path's extension.
26    pub fn from_path(path: &Path) -> Option<Self> {
27        path.extension()
28            .and_then(|ext| ext.to_str())
29            .and_then(Self::from_extension)
30    }
31}
32
33/// Parse a configuration string in the given format into type `T`.
34pub fn parse_config<T: DeserializeOwned>(
35    content: &str,
36    format: ConfigFormat,
37) -> Result<T, SynapticError> {
38    match format {
39        ConfigFormat::Toml => toml::from_str(content)
40            .map_err(|e| SynapticError::Config(format!("TOML parse error: {e}"))),
41        ConfigFormat::Json => serde_json::from_str(content)
42            .map_err(|e| SynapticError::Config(format!("JSON parse error: {e}"))),
43        ConfigFormat::Yaml => serde_yml::from_str(content)
44            .map_err(|e| SynapticError::Config(format!("YAML parse error: {e}"))),
45    }
46}