asciidoc-parser 0.18.0

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

use crate::tests::{
    fixtures::{Span, document::InterpretedValue},
    prelude::*,
};

#[derive(Eq, PartialEq)]
pub(crate) struct Attribute {
    pub name: Span,
    pub value_source: Option<Span>,
    pub value: InterpretedValue,
    pub source: Span,
}

impl fmt::Debug for Attribute {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("crate::document::Attribute")
            .field("name", &self.name)
            .field("value_source", &self.value_source)
            .field("value", &self.value)
            .field("source", &self.source)
            .finish()
    }
}

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

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

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

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

    if &fixture.name != observed.name() {
        return false;
    }

    if let Some(ref fixture_value_source) = fixture.value_source
        && let Some(observed_raw_value) = observed.raw_value()
        && fixture_value_source != &observed_raw_value
    {
        return false;
    }

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

    if &fixture.value != observed.value() {
        return false;
    }

    true
}