diff --git a/libcorn/src/de.rs b/libcorn/src/de.rs index bdc6502..d786e76 100644 --- a/libcorn/src/de.rs +++ b/libcorn/src/de.rs @@ -3,7 +3,7 @@ use std::collections::VecDeque; use serde::de::{DeserializeSeed, EnumAccess, IntoDeserializer, VariantAccess, Visitor}; use serde::{de, Deserialize}; -use crate::error::{DeserializationError, Result}; +use crate::error::{DeserializationError, Error, Result}; use crate::parse; use crate::Value; @@ -32,6 +32,18 @@ where Ok(T::deserialize(&mut deserializer)?) } +pub fn from_slice<'de, T>(bytes: &'de [u8]) -> Result +where + T: de::Deserialize<'de>, +{ + match std::str::from_utf8(bytes) { + Ok(s) => from_str(s), + Err(e) => Err(Error::DeserializationError(DeserializationError( + e.to_string(), + ))), + } +} + macro_rules! get_value { ($self:ident) => { match $self.value.take() { diff --git a/libcorn/src/error.rs b/libcorn/src/error.rs index 86ec529..f84d2a1 100644 --- a/libcorn/src/error.rs +++ b/libcorn/src/error.rs @@ -36,6 +36,12 @@ impl From> for Error { } } +impl From for Error { + fn from(err: DeserializationError) -> Self { + Self::DeserializationError(err) + } +} + impl Display for Error { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { diff --git a/libcorn/src/lib.rs b/libcorn/src/lib.rs index dac4a64..9726a0f 100644 --- a/libcorn/src/lib.rs +++ b/libcorn/src/lib.rs @@ -1,7 +1,7 @@ use serde::Serialize; use std::collections::{BTreeMap, HashMap}; -pub use crate::de::from_str; +pub use crate::de::{from_slice, from_str}; pub use crate::parser::{parse, Rule}; pub mod error;