#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
pub enum QuoteStyle {
#[default]
Single,
Double,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
pub enum Layout {
#[default]
Default,
SerdeYaml,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Emit {
indent: usize,
quote_style: QuoteStyle,
line_width: Option<usize>,
indent_sequences: bool,
layout: Layout,
}
impl Emit {
pub const MAX_INDENT: usize = 64;
#[must_use]
pub const fn new() -> Self {
Self {
indent: 2,
quote_style: QuoteStyle::Single,
line_width: None,
indent_sequences: true,
layout: Layout::Default,
}
}
#[must_use]
pub const fn indent(mut self, spaces: usize) -> Self {
self.indent = spaces;
self
}
#[must_use]
pub const fn quote_style(mut self, style: QuoteStyle) -> Self {
self.quote_style = style;
self
}
#[must_use]
pub const fn line_width(mut self, width: Option<usize>) -> Self {
self.line_width = width;
self
}
#[must_use]
pub const fn indent_sequences(mut self, on: bool) -> Self {
self.indent_sequences = on;
self
}
#[must_use]
pub const fn layout(mut self, layout: Layout) -> Self {
self.layout = layout;
self
}
#[must_use]
pub const fn get_indent(&self) -> usize {
self.indent
}
#[must_use]
pub const fn get_quote_style(&self) -> QuoteStyle {
self.quote_style
}
#[must_use]
pub const fn get_line_width(&self) -> Option<usize> {
self.line_width
}
#[must_use]
pub const fn get_indent_sequences(&self) -> bool {
self.indent_sequences
}
#[must_use]
pub const fn get_layout(&self) -> Layout {
self.layout
}
}
impl Default for Emit {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_and_setters() {
let d = Emit::default();
assert_eq!(d, Emit::new());
assert_eq!(
(
d.get_indent(),
d.get_quote_style(),
d.get_line_width(),
d.get_indent_sequences(),
d.get_layout()
),
(2, QuoteStyle::Single, None, true, Layout::Default)
);
const E: Emit = Emit::new()
.indent(4)
.quote_style(QuoteStyle::Double)
.line_width(Some(80))
.indent_sequences(false)
.layout(Layout::SerdeYaml);
assert_eq!(
(
E.get_indent(),
E.get_quote_style(),
E.get_line_width(),
E.get_indent_sequences(),
E.get_layout()
),
(4, QuoteStyle::Double, Some(80), false, Layout::SerdeYaml)
);
assert_eq!(QuoteStyle::default(), QuoteStyle::Single);
assert_eq!(Layout::default(), Layout::Default);
}
}