konfig_rust/
format.rs

1use crate::KonfigError;
2use serde::Serialize;
3use serde::de::DeserializeOwned;
4use std::str;
5
6pub enum Format {
7    JSON,
8    YAML,
9    TOML,
10}
11
12impl Format {
13    pub fn create_handler(&self) -> FormatHandlerEnum {
14        match self {
15            Format::JSON => FormatHandlerEnum::JSON(JSONFormat {}),
16            Format::YAML => FormatHandlerEnum::YAML(YAMLFormat {}),
17            Format::TOML => FormatHandlerEnum::TOML(TOMLFormat {}),
18        }
19    }
20}
21
22// Needed couse rust is a crybaby and won't let me use generic traits
23pub enum FormatHandlerEnum {
24    JSON(JSONFormat),
25    YAML(YAMLFormat),
26    TOML(TOMLFormat),
27}
28
29impl FormatHandlerEnum {
30    pub fn marshal<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, KonfigError> {
31        match self {
32            FormatHandlerEnum::JSON(handler) => handler.marshal(data),
33            FormatHandlerEnum::YAML(handler) => handler.marshal(data),
34            FormatHandlerEnum::TOML(handler) => handler.marshal(data),
35        }
36    }
37
38    pub fn unmarshal<T: DeserializeOwned>(&self, data: &[u8]) -> Result<T, KonfigError> {
39        match self {
40            FormatHandlerEnum::JSON(handler) => handler.unmarshal(data),
41            FormatHandlerEnum::YAML(handler) => handler.unmarshal(data),
42            FormatHandlerEnum::TOML(handler) => handler.unmarshal(data),
43        }
44    }
45}
46
47pub trait FormatHandler {
48    fn marshal<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, KonfigError>;
49    fn unmarshal<T: DeserializeOwned>(&self, data: &[u8]) -> Result<T, KonfigError>;
50}
51
52pub struct JSONFormat {}
53impl FormatHandler for JSONFormat {
54    fn marshal<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, KonfigError> {
55        serde_json::to_vec(data).map_err(|err| KonfigError::MarshalError(err.to_string()))
56    }
57
58    fn unmarshal<T: DeserializeOwned>(&self, data: &[u8]) -> Result<T, KonfigError> {
59        serde_json::from_slice(data).map_err(|err| KonfigError::UnmarshalError(err.to_string()))
60    }
61}
62
63pub struct YAMLFormat {}
64impl FormatHandler for YAMLFormat {
65    fn marshal<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, KonfigError> {
66        serde_yaml::to_string(data)
67            .map_err(|err| KonfigError::MarshalError(err.to_string()))
68            .map(|s| s.into_bytes())
69    }
70
71    fn unmarshal<T: DeserializeOwned>(&self, data: &[u8]) -> Result<T, KonfigError> {
72        serde_yaml::from_slice(data).map_err(|err| KonfigError::UnmarshalError(err.to_string()))
73    }
74}
75
76pub struct TOMLFormat {}
77impl FormatHandler for TOMLFormat {
78    fn marshal<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, KonfigError> {
79        toml::to_string(data)
80            .map_err(|err| KonfigError::MarshalError(err.to_string()))
81            .map(|s| s.into_bytes())
82    }
83
84    fn unmarshal<T: DeserializeOwned>(&self, data: &[u8]) -> Result<T, KonfigError> {
85        str::from_utf8(data)
86            .map_err(|err| KonfigError::UnmarshalError(err.to_string()))
87            .and_then(|s| {
88                toml::from_str(s).map_err(|err| KonfigError::UnmarshalError(err.to_string()))
89            })
90    }
91}