use proc_macro2::TokenStream as TokenStream2;
use quote::{quote, ToTokens};
use crate::parser::command_spec::{Enumeration, Identifier};
impl Enumeration {
fn derive_from_paired(
&self,
ident_self: &TokenStream2,
_ident_paired: &TokenStream2,
paired_type: &TokenStream2,
) -> TokenStream2 {
let match_lines: TokenStream2 = self
.states
.iter()
.map(|state| {
let name = Into::<Identifier>::into(state).to_rust();
quote! {
#paired_type :: #name => Self :: #name,
}
})
.collect();
quote! {
impl From<#paired_type> for #ident_self {
fn from(value: #paired_type) -> Self {
match value {
#match_lines
}
}
}
}
}
pub fn derive_from_c_paried_rust(&self, paired_type: &TokenStream2) -> TokenStream2 {
let c_ident = &self.identifier.to_c();
let ident = &self.identifier.to_rust();
self.derive_from_paired(&c_ident.into_token_stream(), &ident, &paired_type)
}
pub fn derive_from_rust_paried_c(&self, paired_type: &TokenStream2) -> TokenStream2 {
let c_ident = &self.identifier.to_c();
let ident = &self.identifier.to_rust();
self.derive_from_paired(&ident, &c_ident.into_token_stream(), &paired_type)
}
}