use super::options::SerializerOptions;
#[cfg(feature = "serialize")]
pub fn to_string<T: serde::Serialize>(value: &T) -> std::result::Result<String, crate::ser::Error> {
let mut out = String::new();
to_fmt_writer(&mut out, value)?;
Ok(out)
}
#[cfg(feature = "serialize")]
pub fn to_string_with_options<T: serde::Serialize>(
value: &T,
options: SerializerOptions,
) -> std::result::Result<String, crate::ser::Error> {
let mut out = String::new();
to_fmt_writer_with_options(&mut out, value, options)?;
Ok(out)
}
#[deprecated(
since = "0.0.7",
note = "Use `to_fmt_writer` for `fmt::Write` (String, fmt::Formatter) or `to_io_writer` for files/sockets."
)]
#[cfg(feature = "serialize")]
pub fn to_writer<W: std::fmt::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
) -> std::result::Result<(), crate::ser::Error> {
let mut ser = crate::ser::YamlSerializer::new(output);
value.serialize(&mut ser)
}
#[cfg(feature = "serialize")]
pub fn to_fmt_writer<W: std::fmt::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
) -> std::result::Result<(), crate::ser::Error> {
to_fmt_writer_with_options(output, value, SerializerOptions::default())
}
#[cfg(feature = "serialize")]
pub fn to_io_writer<W: std::io::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
) -> std::result::Result<(), crate::ser::Error> {
to_io_writer_with_options(output, value, SerializerOptions::default())
}
#[cfg(feature = "serialize")]
pub fn to_fmt_writer_with_options<W: std::fmt::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
mut options: SerializerOptions,
) -> std::result::Result<(), crate::ser::Error> {
options.consistent()?;
let mut ser = crate::ser::YamlSerializer::with_options(output, &mut options);
value.serialize(&mut ser)
}
#[cfg(feature = "serialize")]
pub fn to_io_writer_with_options<W: std::io::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
mut options: SerializerOptions,
) -> std::result::Result<(), crate::ser::Error> {
options.consistent()?;
struct Adapter<'a, W: std::io::Write> {
output: &'a mut W,
last_err: Option<std::io::Error>,
}
impl<'a, W: std::io::Write> std::fmt::Write for Adapter<'a, W> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
if let Err(e) = self.output.write_all(s.as_bytes()) {
self.last_err = Some(e);
return Err(std::fmt::Error);
}
Ok(())
}
fn write_char(&mut self, c: char) -> std::fmt::Result {
let mut buf = [0u8; 4];
let s = c.encode_utf8(&mut buf);
self.write_str(s)
}
}
let mut adapter = Adapter {
output,
last_err: None,
};
let mut ser = crate::ser::YamlSerializer::with_options(&mut adapter, &mut options);
match value.serialize(&mut ser) {
Ok(()) => Ok(()),
Err(e) => {
if let Some(io_error) = adapter.last_err.take() {
return Err(crate::ser::Error::from(io_error));
}
Err(e)
}
}
}
#[deprecated(
since = "0.0.7",
note = "Use `to_fmt_writer_with_options` for fmt::Write or `to_io_writer_with_options` for io::Write."
)]
#[cfg(feature = "serialize")]
pub fn to_writer_with_options<W: std::fmt::Write, T: serde::Serialize>(
output: &mut W,
value: &T,
options: SerializerOptions,
) -> std::result::Result<(), crate::ser::Error> {
to_fmt_writer_with_options(output, value, options)
}
#[cfg(feature = "serialize")]
pub fn to_string_multiple<T: serde::Serialize>(
values: &[T],
) -> std::result::Result<String, crate::ser::Error> {
to_string_multiple_with_options(values, SerializerOptions::default())
}
#[cfg(feature = "serialize")]
pub fn to_string_multiple_with_options<T: serde::Serialize>(
values: &[T],
options: SerializerOptions,
) -> std::result::Result<String, crate::ser::Error> {
let mut out = String::new();
let mut first = true;
for v in values {
if !first {
out.push_str("---\n");
}
first = false;
to_fmt_writer_with_options(&mut out, v, options)?;
}
Ok(out)
}