use super::ast::{Span, Spanned};
use num_rational::Ratio;
use std::cmp::PartialEq;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Field<'input> {
pub(crate) letters: &'input str,
pub(crate) value: Value<'input>,
pub(crate) raw_value: Vec<&'input str>,
pub(crate) span: Span,
}
impl<'input> Field<'input> {
pub fn iter_bytes(&'input self) -> impl Iterator<Item = &'input u8> {
self.letters
.as_bytes()
.iter()
.chain(self.raw_value.iter().map(|s| s.as_bytes().iter()).flatten())
}
}
impl<'input> Spanned for Field<'input> {
fn span(&self) -> Span {
self.span
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Value<'input> {
Rational(Ratio<i64>),
Integer(usize),
String(&'input str),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Checksum {
pub(crate) inner: u8,
pub(crate) span: Span,
}
impl Spanned for Checksum {
fn span(&self) -> Span {
self.span
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Newline {
pub(crate) pos: usize,
}
impl Spanned for Newline {
fn span(&self) -> Span {
Span(self.pos, self.pos + 1)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Whitespace<'input> {
pub(crate) inner: &'input str,
pub(crate) pos: usize,
}
impl<'input> Whitespace<'input> {
pub fn iter_bytes(&'input self) -> impl Iterator<Item = &'input u8> {
self.inner.as_bytes().iter()
}
}
impl<'input> Spanned for Whitespace<'input> {
fn span(&self) -> Span {
Span(self.pos, self.pos + self.inner.len())
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Comment<'input> {
pub(crate) inner: &'input str,
pub(crate) pos: usize,
}
impl<'input> Comment<'input> {
pub fn iter_bytes(&'input self) -> impl Iterator<Item = &'input u8> {
self.inner.as_bytes().iter()
}
}
impl<'input> Spanned for Comment<'input> {
fn span(&self) -> Span {
Span(self.pos, self.pos + self.inner.len())
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InlineComment<'input> {
pub(crate) inner: &'input str,
pub(crate) pos: usize,
}
impl<'input> InlineComment<'input> {
pub fn iter_bytes(&'input self) -> impl Iterator<Item = &'input u8> {
self.inner.as_bytes().iter()
}
}
impl<'input> Spanned for InlineComment<'input> {
fn span(&self) -> Span {
Span(self.pos, self.pos + self.inner.len())
}
}