synaptic_config/
format.rs1use std::path::Path;
2
3use serde::de::DeserializeOwned;
4use synaptic_core::SynapticError;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum ConfigFormat {
9 Toml,
10 Json,
11 Yaml,
12}
13
14impl ConfigFormat {
15 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 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
33pub 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}