rustc_errors/markdown/
mod.rs

1//! A simple markdown parser that can write formatted text to the terminal
2//!
3//! Entrypoint is `MdStream::parse_str(...)`
4
5use std::io;
6
7mod parse;
8mod term;
9
10/// An AST representation of a Markdown document
11#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for MdStream<'a> {
    #[inline]
    fn clone(&self) -> MdStream<'a> {
        MdStream(::core::clone::Clone::clone(&self.0))
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for MdStream<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "MdStream",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl<'a> ::core::default::Default for MdStream<'a> {
    #[inline]
    fn default() -> MdStream<'a> {
        MdStream(::core::default::Default::default())
    }
}Default, #[automatically_derived]
impl<'a> ::core::cmp::PartialEq for MdStream<'a> {
    #[inline]
    fn eq(&self, other: &MdStream<'a>) -> bool { self.0 == other.0 }
}PartialEq)]
12pub struct MdStream<'a>(Vec<MdTree<'a>>);
13
14impl<'a> MdStream<'a> {
15    /// Parse a markdown string to a tokenstream
16    #[must_use]
17    pub fn parse_str(s: &str) -> MdStream<'_> {
18        parse::entrypoint(s)
19    }
20
21    /// Write formatted output to an anstream buffer
22    pub fn write_anstream_buf(&self, buf: &mut Vec<u8>) -> io::Result<()> {
23        term::entrypoint(self, buf)
24    }
25}
26
27/// Create an anstream buffer with the `Always` color choice
28pub fn create_stdout_bufwtr() -> anstream::Stdout {
29    anstream::Stdout::always(std::io::stdout())
30}
31
32/// A single tokentree within a Markdown document
33#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for MdTree<'a> {
    #[inline]
    fn clone(&self) -> MdTree<'a> {
        match self {
            MdTree::Comment(__self_0) =>
                MdTree::Comment(::core::clone::Clone::clone(__self_0)),
            MdTree::CodeBlock { txt: __self_0, lang: __self_1 } =>
                MdTree::CodeBlock {
                    txt: ::core::clone::Clone::clone(__self_0),
                    lang: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::CodeInline(__self_0) =>
                MdTree::CodeInline(::core::clone::Clone::clone(__self_0)),
            MdTree::Strong(__self_0) =>
                MdTree::Strong(::core::clone::Clone::clone(__self_0)),
            MdTree::Emphasis(__self_0) =>
                MdTree::Emphasis(::core::clone::Clone::clone(__self_0)),
            MdTree::Strikethrough(__self_0) =>
                MdTree::Strikethrough(::core::clone::Clone::clone(__self_0)),
            MdTree::PlainText(__self_0) =>
                MdTree::PlainText(::core::clone::Clone::clone(__self_0)),
            MdTree::Link { disp: __self_0, link: __self_1 } =>
                MdTree::Link {
                    disp: ::core::clone::Clone::clone(__self_0),
                    link: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::RefLink { disp: __self_0, id: __self_1 } =>
                MdTree::RefLink {
                    disp: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::LinkDef { id: __self_0, link: __self_1 } =>
                MdTree::LinkDef {
                    id: ::core::clone::Clone::clone(__self_0),
                    link: ::core::clone::Clone::clone(__self_1),
                },
            MdTree::ParagraphBreak => MdTree::ParagraphBreak,
            MdTree::LineBreak => MdTree::LineBreak,
            MdTree::HorizontalRule => MdTree::HorizontalRule,
            MdTree::Heading(__self_0, __self_1) =>
                MdTree::Heading(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            MdTree::OrderedListItem(__self_0, __self_1) =>
                MdTree::OrderedListItem(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            MdTree::UnorderedListItem(__self_0) =>
                MdTree::UnorderedListItem(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for MdTree<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MdTree::Comment(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Comment", &__self_0),
            MdTree::CodeBlock { txt: __self_0, lang: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "CodeBlock", "txt", __self_0, "lang", &__self_1),
            MdTree::CodeInline(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CodeInline", &__self_0),
            MdTree::Strong(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Strong",
                    &__self_0),
            MdTree::Emphasis(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Emphasis", &__self_0),
            MdTree::Strikethrough(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Strikethrough", &__self_0),
            MdTree::PlainText(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "PlainText", &__self_0),
            MdTree::Link { disp: __self_0, link: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Link",
                    "disp", __self_0, "link", &__self_1),
            MdTree::RefLink { disp: __self_0, id: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "RefLink", "disp", __self_0, "id", &__self_1),
            MdTree::LinkDef { id: __self_0, link: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "LinkDef", "id", __self_0, "link", &__self_1),
            MdTree::ParagraphBreak =>
                ::core::fmt::Formatter::write_str(f, "ParagraphBreak"),
            MdTree::LineBreak =>
                ::core::fmt::Formatter::write_str(f, "LineBreak"),
            MdTree::HorizontalRule =>
                ::core::fmt::Formatter::write_str(f, "HorizontalRule"),
            MdTree::Heading(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Heading", __self_0, &__self_1),
            MdTree::OrderedListItem(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "OrderedListItem", __self_0, &__self_1),
            MdTree::UnorderedListItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnorderedListItem", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<'a> ::core::cmp::PartialEq for MdTree<'a> {
    #[inline]
    fn eq(&self, other: &MdTree<'a>) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (MdTree::Comment(__self_0), MdTree::Comment(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::CodeBlock { txt: __self_0, lang: __self_1 },
                    MdTree::CodeBlock { txt: __arg1_0, lang: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::CodeInline(__self_0), MdTree::CodeInline(__arg1_0))
                    => __self_0 == __arg1_0,
                (MdTree::Strong(__self_0), MdTree::Strong(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Emphasis(__self_0), MdTree::Emphasis(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Strikethrough(__self_0),
                    MdTree::Strikethrough(__arg1_0)) => __self_0 == __arg1_0,
                (MdTree::PlainText(__self_0), MdTree::PlainText(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (MdTree::Link { disp: __self_0, link: __self_1 },
                    MdTree::Link { disp: __arg1_0, link: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::RefLink { disp: __self_0, id: __self_1 },
                    MdTree::RefLink { disp: __arg1_0, id: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::LinkDef { id: __self_0, link: __self_1 },
                    MdTree::LinkDef { id: __arg1_0, link: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::Heading(__self_0, __self_1),
                    MdTree::Heading(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::OrderedListItem(__self_0, __self_1),
                    MdTree::OrderedListItem(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (MdTree::UnorderedListItem(__self_0),
                    MdTree::UnorderedListItem(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
34pub enum MdTree<'a> {
35    /// Leaf types
36    Comment(&'a str),
37    CodeBlock {
38        txt: &'a str,
39        lang: Option<&'a str>,
40    },
41    CodeInline(&'a str),
42    Strong(&'a str),
43    Emphasis(&'a str),
44    Strikethrough(&'a str),
45    PlainText(&'a str),
46    /// [Foo](www.foo.com) or simple anchor <www.foo.com>
47    Link {
48        disp: &'a str,
49        link: &'a str,
50    },
51    /// `[Foo link][ref]`
52    RefLink {
53        disp: &'a str,
54        id: Option<&'a str>,
55    },
56    /// [ref]: www.foo.com
57    LinkDef {
58        id: &'a str,
59        link: &'a str,
60    },
61    /// Break bewtween two paragraphs (double `\n`), not directly parsed but
62    /// added later
63    ParagraphBreak,
64    /// Break bewtween two lines (single `\n`)
65    LineBreak,
66    HorizontalRule,
67    Heading(u8, MdStream<'a>),
68    OrderedListItem(u16, MdStream<'a>),
69    UnorderedListItem(MdStream<'a>),
70}
71
72impl<'a> From<Vec<MdTree<'a>>> for MdStream<'a> {
73    fn from(value: Vec<MdTree<'a>>) -> Self {
74        Self(value)
75    }
76}