serde_valid/features/toml/
from_toml_reader.rs

1pub trait FromTomlReader
2where
3    Self: Sized,
4{
5    /// Convert from toml reader.
6    ///
7    /// ```should_panic
8    /// use std::fs::File;
9    /// use serde::Deserialize;
10    /// use serde_valid::Validate;
11    /// use serde_valid::toml::FromTomlReader;
12    ///
13    /// #[derive(Debug, Validate, Deserialize)]
14    /// struct TestStruct {
15    ///     #[validate(maximum = 2000)]
16    ///     val: i32,
17    /// }
18    ///
19    /// let s = TestStruct::from_toml_reader(File::open("foo.txt").unwrap());
20    ///
21    /// assert!(s.is_ok())
22    /// ```
23    fn from_toml_reader<R>(reader: R) -> Result<Self, crate::Error<serde_toml::de::Error>>
24    where
25        R: std::io::Read;
26}
27
28impl<T> FromTomlReader for T
29where
30    T: serde::de::DeserializeOwned + crate::Validate,
31{
32    fn from_toml_reader<R>(reader: R) -> Result<Self, crate::Error<serde_toml::de::Error>>
33    where
34        R: std::io::Read,
35    {
36        use serde::de::Error;
37
38        let mut buffer = String::new();
39        let mut reader = reader;
40        reader
41            .read_to_string(&mut buffer)
42            .map_err(serde_toml::de::Error::custom)?;
43
44        let model: T = serde_toml::from_str(&buffer)?;
45        model.validate().map_err(crate::Error::ValidationError)?;
46        Ok(model)
47    }
48}