inktree 0.1.0

An incremental syntax tree engine for fast, expressive language tooling in Rust
Documentation
use itertools::Itertools;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Ident, punctuated::Punctuated, token::Comma};

use crate::{derive::parser::FromMeta, language::ElementError};

#[derive(Debug, PartialEq, Eq, Hash)]
pub struct _DelimitedBy {
    pub open: Ident,
    pub close: Ident,
}

impl _DelimitedBy {
    pub fn _parser(&self, inner: &TokenStream) -> TokenStream {
        let Self { open, close } = self;

        quote! {#inner.padded_by(#open::parser(),#close::parser())}
    }
}

impl FromMeta for _DelimitedBy {
    fn from_list(list: &syn::MetaList, _name: Option<&Ident>) -> Result<Self, ElementError> {
        let (open, close) = list
            .parse_args_with(Punctuated::<Ident, Comma>::parse_terminated)?
            .into_iter()
            .collect_tuple()
            .expect("todo error handling argument count");
        Ok(Self { open, close })
    }
}