toml/de/mod.rs
1//! Deserializing TOML into Rust structures.
2//!
3//! This module contains all the Serde support for deserializing TOML documents
4//! into Rust structures. Note that some top-level functions here are also
5//! provided at the top of the crate.
6
7#[cfg(feature = "parse")]
8#[cfg(feature = "serde")]
9mod deserializer;
10mod error;
11#[cfg(feature = "parse")]
12mod parser;
13
14#[cfg(feature = "parse")]
15#[cfg(feature = "serde")]
16pub use deserializer::Deserializer;
17#[cfg(feature = "parse")]
18#[cfg(feature = "serde")]
19pub use deserializer::ValueDeserializer;
20#[cfg(feature = "parse")]
21pub use parser::DeArray;
22#[cfg(feature = "parse")]
23pub use parser::DeFloat;
24#[cfg(feature = "parse")]
25pub use parser::DeInteger;
26#[cfg(feature = "parse")]
27pub use parser::DeString;
28#[cfg(feature = "parse")]
29pub use parser::DeTable;
30#[cfg(feature = "parse")]
31pub use parser::DeValue;
32
33pub use error::Error;
34
35use crate::alloc_prelude::*;
36
37/// Deserializes a string into a type.
38///
39/// This function will attempt to interpret `s` as a TOML document and
40/// deserialize `T` from the document.
41///
42/// To deserializes TOML values, instead of documents, see [`ValueDeserializer`].
43///
44/// # Examples
45///
46/// ```
47/// use serde::Deserialize;
48///
49/// #[derive(Deserialize)]
50/// struct Config {
51/// title: String,
52/// owner: Owner,
53/// }
54///
55/// #[derive(Deserialize)]
56/// struct Owner {
57/// name: String,
58/// }
59///
60/// let config: Config = toml::from_str(r#"
61/// title = 'TOML Example'
62///
63/// [owner]
64/// name = 'Lisa'
65/// "#).unwrap();
66///
67/// assert_eq!(config.title, "TOML Example");
68/// assert_eq!(config.owner.name, "Lisa");
69/// ```
70#[cfg(feature = "parse")]
71#[cfg(feature = "serde")]
72pub fn from_str<'de, T>(s: &'de str) -> Result<T, Error>
73where
74 T: serde::de::Deserialize<'de>,
75{
76 T::deserialize(Deserializer::parse(s)?)
77}
78
79/// Deserializes bytes into a type.
80///
81/// This function will attempt to interpret `s` as a TOML document and
82/// deserialize `T` from the document.
83///
84/// To deserializes TOML values, instead of documents, see [`ValueDeserializer`].
85#[cfg(feature = "parse")]
86#[cfg(feature = "serde")]
87pub fn from_slice<'de, T>(s: &'de [u8]) -> Result<T, Error>
88where
89 T: serde::de::Deserialize<'de>,
90{
91 let s = core::str::from_utf8(s).map_err(|e| Error::custom(e.to_string(), None))?;
92 from_str(s)
93}