fml 0.6.7

Friendly Markup Language
Documentation
use crate::ast::{FmlList, ListItem};

use super::{Content, Debug, FmlCodeBlockValue, FmlColor, FmlValue, Section};

macro_rules! debug_inner {
    ($name:expr, $inner:expr, $fmt:expr) => {{
        $fmt.write_str($name)?;
        $fmt.write_str(" ")?;
        $fmt.debug_list().entries($inner.iter()).finish()
    }};
}

macro_rules! debug_inline {
    ($name:expr, $inner:expr, $fmt:expr) => {{
        // $fmt.write_str("(\"")?;
        $fmt.write_str($name)?;
        $fmt.write_str("(\"")?;
        $fmt.write_str($inner)?;
        $fmt.write_str("\")")
    }};
}

impl Debug for Content {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        debug_inner!("Content", &self, f)
    }
}

impl Debug for Section {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        debug_inner!("Section", &self.0, f)
    }
}

impl Debug for FmlValue {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Linebreak => write!(f, "Linebreak"),
            Self::Heading1(x) => debug_inner!("Header1", x, f),
            Self::Heading2(x) => debug_inner!("Header2", x, f),
            Self::Heading3(x) => debug_inner!("Header3", x, f),
            Self::Superline(x) => debug_inner!("Superline", x, f),
            Self::Subline(x) => debug_inner!("Subline", x, f),
            Self::Bold(x) => debug_inner!("Bold", x, f),
            Self::Italic(x) => debug_inner!("Italic", x, f),
            Self::Strikethrough(x) => debug_inner!("Strikethrough", x, f),
            Self::Quote(x) => debug_inner!("Quote", x, f),
            Self::List(x) => debug_inner!("List", x, f),
            Self::Superscript(x) => debug_inner!("Superscript", x, f),
            Self::Subscript(x) => debug_inner!("Subscript", x, f),
            Self::Underline(x) => debug_inner!("Underline", x, f),
            Self::ColorFg(FmlColor { color, body }) => f
                .debug_struct("ColorFg")
                .field("color", color)
                .field("body", body)
                .finish(),
            Self::ColorBg(FmlColor { color, body }) => f
                .debug_struct("ColorBg")
                .field("color", color)
                .field("body", body)
                .finish(),
            Self::ContentWarning { reason, body } => f
                .debug_struct("CW")
                .field("reason", reason)
                .field("body", body)
                .finish(),
            Self::CodeBlock { lang, body } => f
                .debug_struct("CodeBlock")
                .field("lang", lang)
                .field("body", body)
                .finish(),
            Self::Hyperlink { fml, uri } => f
                .debug_struct("Hyperlink")
                .field("fml", fml)
                .field("uri", uri)
                .finish(),
            Self::CodeInline(x) => debug_inline!("CodeInline", x, f),
            Self::Typst(x) => debug_inline!("Typst", x, f),
            Self::Text(x) => debug_inline!("Text", x, f),
        }
    }
}

impl Debug for FmlList {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        debug_inner!("List", &self, f)
    }
}

impl Debug for ListItem {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        debug_inner!("ListItem", &self, f)
    }
}