taplo 0.1.0

A TOML parser, analyzer and formatter library
Documentation
macro_rules! dom_node_from {
    ($($inner:ty => $name:ident),*) => {
        $(
            impl From<$inner> for Node {
                fn from(inner: $inner) -> Self {
                    Node::$name(inner)
                }
            }
        )*
    };
}

macro_rules! dom_node {
    (
    $(#[$attrs:meta])*
    pub struct $name:ident {
        $(
            $(#[$field_attrs:meta])*
            $field_name:ident: $field_ty:ty,
        )*
    }) => {
    $(#[$attrs])*
    pub struct $name {
            syntax: SyntaxElement,
            $(
                $(#[$field_attrs])*
                $field_name: $field_ty,
            )*
        }

        impl NodeSyntax for $name {
            fn syntax(&self) -> SyntaxElement {
                self.syntax.clone()
            }
        }

        impl core::fmt::Display for $name {
            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                self.syntax.fmt(f)
            }
        }
    }
}

macro_rules! dom_node_no_display {
    (
    $(#[$attrs:meta])*
    pub struct $name:ident {
        $(
            $(#[$field_attrs:meta])*
            $field_name:ident: $field_ty:ty,
        )*
    }) => {
    $(#[$attrs])*
    pub struct $name {
            syntax: SyntaxElement,
            $(
                $(#[$field_attrs])*
                $field_name: $field_ty,
            )*
        }

        impl NodeSyntax for $name {
            fn syntax(&self) -> SyntaxElement {
                self.syntax.clone()
            }
        }
    }
}

macro_rules! dom_primitives {
    ($($($kind:ident)|* => $ast:ident),*) => {
        $(
            #[derive(Debug, Clone, PartialEq, Eq, Hash)]
            #[repr(transparent)]
            pub struct $ast(SyntaxElement);
            impl Cast for $ast {
                #[allow(unused)]
                fn cast(elem: SyntaxElement) -> Option<Self> {
                    match &elem {
                        rowan::NodeOrToken::Token(t) => {
                            match t.kind() {
                                $($kind)|* => {
                                    Some(Self(elem))
                                }
                                _ => {
                                    None
                                }
                            }
                        },
                        _ => {
                            None
                        }
                    }
                }
            }

            impl NodeSyntax for $ast {
                fn syntax(&self) -> SyntaxElement {
                    self.0.clone()
                }
            }
        )*
    };
}

macro_rules! dom_sealed {
    ($($id:ty,)*) => {
        $(impl Sealed for $id {})*
    };
}

macro_rules! rewrite_node_from {
    ($($inner:ty => $name:ident),*) => {
        $(
            impl From<$inner> for RewriteNode {
                fn from(inner: $inner) -> Self {
                    RewriteNode::New(Node::from(inner))
                }
            }

            impl From<$inner> for Node {
                fn from(inner: $inner) -> Self {
                    Node::$name(inner.into())
                }
            }
        )*
    };
}

macro_rules! rewrite_impl {
    ($(dom::$id:ident,)*) => {
        $(
            impl Rewrite for dom::$id {
                type Builder = builders::$id;

                fn rewrite() -> Self::Builder {
                    Self::Builder::new()
                }
            }
        )*
    };
}

macro_rules! rewrite_value_node_from {
    ($($v:ident => $id:ident,)*) => {
        $(
            impl From<OldOrNew<dom::$id>> for ValueNode {
                fn from(v: OldOrNew<dom::$id>) -> Self {
                    Self::$v(v)
                }
            }

            impl From<$id> for ValueNode {
                fn from(v: $id) -> Self {
                    ValueNode::$v(OldOrNew::New(v))
                }
            }
        )*

    };
}

macro_rules! impl_is {
    ($name:ident;$($method_name:ident() -> $variant:ident;)*) => {
        impl $name {
            $(
                pub fn $method_name(&self) -> bool {
                    matches!(self, $name::$variant(_))
                }
            )*
        }
    }
}