use crate::{FormatOptions, IndentStyle, IndentWidth, LineWidth};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PrinterOptions {
pub indent_width: IndentWidth,
pub print_width: PrintWidth,
pub line_ending: LineEnding,
pub indent_style: IndentStyle,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct PrintWidth(u32);
impl PrintWidth {
pub fn new(width: u32) -> Self {
Self(width)
}
}
impl Default for PrintWidth {
fn default() -> Self {
LineWidth::default().into()
}
}
impl From<LineWidth> for PrintWidth {
fn from(width: LineWidth) -> Self {
Self(u32::from(u16::from(width)))
}
}
impl From<PrintWidth> for usize {
fn from(width: PrintWidth) -> Self {
width.0 as usize
}
}
impl<'a, O> From<&'a O> for PrinterOptions
where
O: FormatOptions,
{
fn from(options: &'a O) -> Self {
PrinterOptions::default()
.with_indent_style(options.indent_style())
.with_indent_width(options.indent_width())
.with_print_width(options.line_width().into())
}
}
impl PrinterOptions {
pub fn with_print_width(mut self, width: PrintWidth) -> Self {
self.print_width = width;
self
}
pub fn with_indent_style(mut self, style: IndentStyle) -> Self {
self.indent_style = style;
self
}
pub fn with_indent_width(mut self, width: IndentWidth) -> Self {
self.indent_width = width;
self
}
pub(crate) fn indent_style(&self) -> IndentStyle {
self.indent_style
}
pub(super) const fn indent_width(&self) -> IndentWidth {
self.indent_width
}
}
#[allow(dead_code)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum LineEnding {
LineFeed,
CarriageReturnLineFeed,
CarriageReturn,
}
impl LineEnding {
#[inline]
pub const fn as_str(&self) -> &'static str {
match self {
LineEnding::LineFeed => "\n",
LineEnding::CarriageReturnLineFeed => "\r\n",
LineEnding::CarriageReturn => "\r",
}
}
}
impl Default for PrinterOptions {
fn default() -> Self {
PrinterOptions {
indent_width: 2.into(),
print_width: PrintWidth::default(),
indent_style: Default::default(),
line_ending: LineEnding::LineFeed,
}
}
}