use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use crate::parser::command_spec::Structure;
impl Structure {
pub fn derive_convertible(&self, paired_type: &TokenStream2) -> TokenStream2 {
let ident = self.identifier.to_rust();
let into_fields: TokenStream2 = self
.contents
.iter()
.map(|con| {
let ident = &con.name.to_rust();
quote! {
#ident: self.#ident.into(),
}
})
.collect();
quote! {
impl trixy::types::traits::convert_trait::Convertible for #ident {
type Ptr = #paired_type;
fn into_ptr(self) -> Self::Ptr {
Self::Ptr {
#into_fields
}
}
fn from_ptr(_ptr: Self::Ptr) -> Result<Self, trixy::types::error::TypeConversionError> {
todo!()
}
}
}
}
pub fn derive_from_paired(
&self,
ident_self: &TokenStream2,
paired_type: &TokenStream2,
) -> TokenStream2 {
let try_into_fields: TokenStream2 = self
.contents
.iter()
.map(|content| {
let name = content.name.to_rust();
quote! {
#name: value.#name.try_into()?,
}
})
.collect();
quote! {
impl TryFrom<#paired_type> for #ident_self {
type Error = trixy::types::error::TypeConversionError;
fn try_from(value: #paired_type) -> Result<Self, Self::Error> {
Ok(Self {
#try_into_fields
})
}
}
}
}
pub fn derive_from_c_paired_rust(&self, paired_rust_type: &TokenStream2) -> TokenStream2 {
let c_ident = self.identifier.to_c();
self.derive_from_paired(&c_ident, &paired_rust_type)
}
pub fn derive_from_rust_paired_c(&self, paired_c_type: &TokenStream2) -> TokenStream2 {
let rust_ident = self.identifier.to_rust();
self.derive_from_paired(&rust_ident, &paired_c_type)
}
}