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
22pub 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}