use crate::Style::{COMPACT, PRETTY};
use core::fmt::Debug;
use std::io;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Yaml2JsonError {
#[error(transparent)]
SerdeYamlError(#[from] serde_yaml::Error),
#[error(transparent)]
SerdeJsonError(#[from] serde_json::Error),
#[error(transparent)]
IOError(#[from] io::Error),
}
pub enum Style {
COMPACT,
PRETTY,
}
pub struct Yaml2Json {
style: Style,
}
impl Yaml2Json {
pub fn new(style: Style) -> Self {
Self { style }
}
pub fn document_to_string(&self, document: &str) -> Result<String, Yaml2JsonError> {
let s: serde_json::Value = serde_yaml::from_str(document)?;
let res = match self.style {
COMPACT => serde_json::to_string(&s),
PRETTY => serde_json::to_string_pretty(&s),
};
match res {
Ok(s) => Ok(s),
Err(e) => Err(e.into()),
}
}
pub fn document_to_writer<W: io::Write>(
&self,
document: &str,
w: &mut W,
) -> Result<(), Yaml2JsonError> {
let s: serde_json::Value = serde_yaml::from_str(document)?;
let res = match self.style {
PRETTY => serde_json::to_writer_pretty(w, &s),
COMPACT => serde_json::to_writer(w, &s),
};
match res {
Ok(_) => Ok(()),
Err(e) => Err(e.into()),
}
}
}
#[cfg(test)]
mod tests {
use crate::{Style, Yaml2Json};
use std::io::Cursor;
#[test]
fn document_to_string_compact() {
let yaml2json = Yaml2Json::new(Style::COMPACT);
let input = r#"
---
abc: def
"#;
let expected = r#"{"abc":"def"}"#;
let res = yaml2json.document_to_string(input).unwrap();
assert_eq!(expected, res);
}
#[test]
fn document_to_string_pretty() {
let yaml2json = Yaml2Json::new(Style::PRETTY);
let input = r#"
---
abc: def
"#;
let expected = r#"{
"abc": "def"
}"#;
let res = yaml2json.document_to_string(input).unwrap();
assert_eq!(expected, res);
}
#[test]
fn document_to_writer_compact() {
let yaml2json = Yaml2Json::new(Style::COMPACT);
let input = r#"
---
abc: def
"#;
let expected = r#"{"abc":"def"}"#;
let mut buf = Cursor::new(Vec::<u8>::new());
yaml2json.document_to_writer(input, buf.get_mut()).unwrap();
let res = String::from_utf8(buf.into_inner()).unwrap();
assert_eq!(expected, res);
}
#[test]
fn document_to_writer_pretty() {
let yaml2json = Yaml2Json::new(Style::PRETTY);
let input = r#"
---
abc: def
"#;
let expected = r#"{
"abc": "def"
}"#;
let mut buf = Cursor::new(Vec::<u8>::new());
yaml2json.document_to_writer(input, buf.get_mut()).unwrap();
let res = String::from_utf8(buf.into_inner()).unwrap();
assert_eq!(expected, res);
}
}