asciidoc-parser 0.19.0

Parser for AsciiDoc format
Documentation
use std::{cmp::PartialEq, fmt};

use crate::{
    HasSpan,
    tests::fixtures::{
        Span,
        document::{Attribute, AuthorLine, RevisionLine},
    },
};

#[derive(Eq, PartialEq)]
pub(crate) struct Header {
    pub title_source: Option<Span>,
    pub title: Option<&'static str>,
    pub attributes: &'static [Attribute],
    pub author_line: Option<AuthorLine>,
    pub revision_line: Option<RevisionLine>,
    pub comments: &'static [Span],
    pub source: Span,
}

impl fmt::Debug for Header {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Header")
            .field("title_source", &self.title_source)
            .field("title", &self.title)
            .field("attributes", &self.attributes)
            .field("author_line", &self.author_line)
            .field("revision_line", &self.revision_line)
            .field("comments", &self.comments)
            .field("source", &self.source)
            .finish()
    }
}

impl<'src> PartialEq<crate::document::Header<'src>> for Header {
    fn eq(&self, other: &crate::document::Header<'src>) -> bool {
        fixture_eq_observed(self, other)
    }
}

impl PartialEq<Header> for crate::document::Header<'_> {
    fn eq(&self, other: &Header) -> bool {
        fixture_eq_observed(other, self)
    }
}

impl PartialEq<Header> for &crate::document::Header<'_> {
    fn eq(&self, other: &Header) -> bool {
        fixture_eq_observed(other, self)
    }
}

fn fixture_eq_observed(fixture: &Header, observed: &crate::document::Header) -> bool {
    if fixture.source != observed.span() {
        return false;
    }

    if fixture.title_source.is_some() != observed.title_source().is_some() {
        return false;
    }

    if let Some(ref fixture_title_source) = fixture.title_source
        && let Some(ref observed_title_source) = observed.title_source()
        && fixture_title_source != observed_title_source
    {
        return false;
    }

    if fixture.title.is_some() != observed.title().is_some() {
        return false;
    }

    if let Some(ref fixture_title) = fixture.title
        && let Some(ref observed_title) = observed.title()
        && fixture_title != observed_title
    {
        return false;
    }

    if fixture.attributes.len() != observed.attributes().len() {
        return false;
    }

    for (fixture_attribute, observed_attribute) in
        fixture.attributes.iter().zip(observed.attributes())
    {
        if fixture_attribute != observed_attribute {
            return false;
        }
    }

    if fixture.author_line.is_some() != observed.author_line().is_some() {
        return false;
    }

    if let Some(fixture_author_line) = &fixture.author_line
        && let Some(observed_author_line) = observed.author_line()
        && fixture_author_line != observed_author_line
    {
        return false;
    }

    if fixture.revision_line.is_some() != observed.revision_line().is_some() {
        return false;
    }

    if let Some(fixture_revision_line) = &fixture.revision_line
        && let Some(observed_revision_line) = observed.revision_line()
        && fixture_revision_line != observed_revision_line
    {
        return false;
    }

    if fixture.comments.len() != observed.comments().len() {
        return false;
    }

    for (fixture_comment, observed_comment) in fixture.comments.iter().zip(observed.comments()) {
        if fixture_comment != observed_comment {
            return false;
        }
    }

    true
}