kodept_parse/
common.rs

1use std::fmt::Debug;
2
3use kodept_core::structure::Located;
4use kodept_core::structure::rlt::new_types::Enclosed;
5use kodept_core::structure::rlt::RLT;
6use kodept_core::structure::span::Span;
7
8use crate::error::{Original, ParseErrors};
9use crate::token_match::TokenMatch;
10use crate::token_stream::TokenStream;
11
12pub trait TokenProducer {
13    type Error<'t>;
14
15    fn parse_token<'t>(
16        &self,
17        whole_input: &'t str,
18        position: usize,
19    ) -> Result<TokenMatch<'t>, Self::Error<'t>>;
20}
21
22pub trait EagerTokensProducer {
23    type Error<'t>;
24    
25    fn parse_tokens<'t>(&self, input: &'t str) -> Result<Vec<TokenMatch<'t>>, Self::Error<'t>>;
26}
27
28pub trait RLTProducer {
29    type Error<'t>;
30
31    fn parse_rlt<'t>(&self, input: TokenStream<'t>) -> Result<RLT, Self::Error<'t>>;
32}
33
34pub trait ErrorAdapter<A, O: Original<A>> {
35    fn adapt(self, original_input: O, position: usize) -> ParseErrors<A>;
36}
37
38#[derive(Clone, Debug)]
39pub struct VerboseEnclosed<T> {
40    pub left: Span,
41    pub inner: T,
42    pub right: Span,
43}
44
45impl<T, U: From<T>> From<VerboseEnclosed<T>> for Enclosed<U> {
46    #[inline]
47    fn from(value: VerboseEnclosed<T>) -> Self {
48        Self {
49            left: value.left.into(),
50            inner: value.inner.into(),
51            right: value.right.into(),
52        }
53    }
54}
55
56impl<'t, T> From<(TokenMatch<'t>, T, TokenMatch<'t>)> for VerboseEnclosed<T> {
57    #[inline]
58    fn from(value: (TokenMatch<'t>, T, TokenMatch<'t>)) -> Self {
59        Self {
60            left: value.0.span,
61            inner: value.1,
62            right: value.2.span,
63        }
64    }
65}
66
67impl<T> VerboseEnclosed<T> {
68    pub fn from_located<L: Located>(left: L, inner: T, right: L) -> Self {
69        Self {
70            left: Span::new(left.location()),
71            inner,
72            right: Span::new(right.location()),
73        }
74    }
75}