kodept-parse 0.3.0

Simple compiler with dependent types support in mind
Documentation
use std::fmt::Debug;

use kodept_core::structure::Located;
use kodept_core::structure::rlt::new_types::Enclosed;
use kodept_core::structure::rlt::RLT;
use kodept_core::structure::span::Span;

use crate::error::{Original, ParseErrors};
use crate::token_match::TokenMatch;
use crate::token_stream::TokenStream;

pub trait TokenProducer {
    type Error<'t>;

    fn parse_token<'t>(
        &self,
        whole_input: &'t str,
        position: usize,
    ) -> Result<TokenMatch<'t>, Self::Error<'t>>;
}

pub trait EagerTokensProducer {
    type Error<'t>;
    
    fn parse_tokens<'t>(&self, input: &'t str) -> Result<Vec<TokenMatch<'t>>, Self::Error<'t>>;
}

pub trait RLTProducer {
    type Error<'t>;

    fn parse_rlt<'t>(&self, input: TokenStream<'t>) -> Result<RLT, Self::Error<'t>>;
}

pub trait ErrorAdapter<A, O: Original<A>> {
    fn adapt(self, original_input: O, position: usize) -> ParseErrors<A>;
}

#[derive(Clone, Debug)]
pub struct VerboseEnclosed<T> {
    pub left: Span,
    pub inner: T,
    pub right: Span,
}

impl<T, U: From<T>> From<VerboseEnclosed<T>> for Enclosed<U> {
    #[inline]
    fn from(value: VerboseEnclosed<T>) -> Self {
        Self {
            left: value.left.into(),
            inner: value.inner.into(),
            right: value.right.into(),
        }
    }
}

impl<'t, T> From<(TokenMatch<'t>, T, TokenMatch<'t>)> for VerboseEnclosed<T> {
    #[inline]
    fn from(value: (TokenMatch<'t>, T, TokenMatch<'t>)) -> Self {
        Self {
            left: value.0.span,
            inner: value.1,
            right: value.2.span,
        }
    }
}

impl<T> VerboseEnclosed<T> {
    pub fn from_located<L: Located>(left: L, inner: T, right: L) -> Self {
        Self {
            left: Span::new(left.location()),
            inner,
            right: Span::new(right.location()),
        }
    }
}