use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;
use std::str;
use toml;
use {Error, Result};
pub fn from_toml_file<T, P>(path: P) -> Result<T>
where
T: for<'a> Deserialize<'a>,
P: AsRef<Path>,
{
let f = track!(File::open(path).map_err(Error::from))?;
track!(from_toml_reader(f))
}
pub fn from_toml_reader<T, R>(mut reader: R) -> Result<T>
where
T: for<'a> Deserialize<'a>,
R: Read,
{
let mut toml = String::new();
track!(reader.read_to_string(&mut toml).map_err(Error::from))?;
track!(from_toml_str(&toml))
}
pub fn from_toml_str<T>(toml: &str) -> Result<T>
where
T: DeserializeOwned,
{
let value = track!(toml::from_str(toml).map_err(Error::from))?;
Ok(value)
}
pub fn from_toml_slice<T>(toml: &[u8]) -> Result<T>
where
T: DeserializeOwned,
{
track!(from_toml_str(str::from_utf8(toml).map_err(Error::from)?))
}
pub fn to_toml_file<T, P>(value: &T, path: P) -> Result<()>
where
T: ?Sized + Serialize,
P: AsRef<Path>,
{
let f = track!(File::create(path).map_err(Error::from))?;
track!(to_toml_writer(value, f))
}
pub fn to_toml_writer<T, W>(value: &T, mut writer: W) -> Result<()>
where
T: ?Sized + Serialize,
W: Write,
{
let toml = track!(to_toml_string(value).map_err(Error::from))?;
track!(writer.write_all(toml.as_bytes()).map_err(Error::from))?;
Ok(())
}
pub fn to_toml_string<T>(value: &T) -> Result<String>
where
T: ?Sized + Serialize,
{
let toml = track!(toml::to_string(value).map_err(Error::from))?;
Ok(toml)
}