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}