hocon_rs/
lib.rs

1use ::serde::{Serialize, de::DeserializeOwned};
2
3pub mod config;
4mod config_options;
5pub mod error;
6pub mod object;
7pub mod parser;
8pub(crate) mod path;
9pub mod raw;
10pub mod serde;
11pub mod syntax;
12pub mod transform;
13pub mod value;
14mod merge {
15    pub(crate) mod add_assign;
16    pub(crate) mod array;
17    pub(crate) mod concat;
18    pub(crate) mod delay_replacement;
19    pub(crate) mod object;
20    pub(crate) mod path;
21    pub(crate) mod substitution;
22    pub(crate) mod value;
23}
24pub use config::Config;
25pub use config_options::ConfigOptions;
26pub use error::Error;
27pub use value::Value;
28
29pub type Result<T> = std::result::Result<T, Error>;
30
31pub fn to_value<T>(value: T) -> crate::Result<Value>
32where
33    T: Serialize,
34{
35    let value: Value = serde_json::to_value(value)?.into();
36    Ok(value)
37}
38
39pub fn from_value<T>(value: Value) -> crate::Result<T>
40where
41    T: DeserializeOwned,
42{
43    T::deserialize(value)
44}
45
46#[inline]
47pub(crate) fn join<I, V>(
48    mut iter: I,
49    sep: &str,
50    f: &mut std::fmt::Formatter<'_>,
51) -> std::fmt::Result
52where
53    I: Iterator<Item = V>,
54    V: std::fmt::Display,
55{
56    if let Some(v) = iter.next() {
57        write!(f, "{v}")?;
58        for v in iter {
59            write!(f, "{sep}")?;
60            write!(f, "{v}")?;
61        }
62    }
63    Ok(())
64}
65
66#[inline]
67pub(crate) fn join_format<I, V, S, R>(
68    mut iter: I,
69    f: &mut std::fmt::Formatter<'_>,
70    separator_formatter: S,
71    value_formatter: R,
72) -> std::fmt::Result
73where
74    I: Iterator<Item = V>,
75    S: Fn(&mut std::fmt::Formatter) -> std::fmt::Result,
76    R: Fn(&mut std::fmt::Formatter, V) -> std::fmt::Result,
77{
78    if let Some(v) = iter.next() {
79        value_formatter(f, v)?;
80        for v in iter {
81            separator_formatter(f)?;
82            value_formatter(f, v)?;
83        }
84    }
85    Ok(())
86}
87
88#[inline]
89pub(crate) fn join_debug<I, V>(
90    mut iter: I,
91    sep: &str,
92    f: &mut std::fmt::Formatter<'_>,
93) -> std::fmt::Result
94where
95    I: Iterator<Item = V>,
96    V: std::fmt::Debug,
97{
98    if let Some(v) = iter.next() {
99        write!(f, "{v:?}")?;
100        for v in iter {
101            write!(f, "{sep}")?;
102            write!(f, "{v:?}")?;
103        }
104    }
105    Ok(())
106}
107
108#[cfg(test)]
109mod test {
110    use tracing::level_filters::LevelFilter;
111    use tracing_subscriber::fmt::time::LocalTime;
112
113    #[ctor::ctor]
114    fn init_tracing() {
115        tracing_subscriber::fmt()
116            .with_test_writer()
117            .pretty()
118            .with_max_level(LevelFilter::TRACE)
119            .with_timer(LocalTime::rfc_3339())
120            .try_init();
121    }
122}