odra-codegen 0.7.1

Code generators for Odra IR.
Documentation
use convert_case::{Case, Casing};
use derive_more::From;
use odra_ir::ErrorEnumItem as IrErrorEnumItem;
use proc_macro2::TokenStream;

use crate::GenerateCode;

#[derive(From)]
pub struct ErrorEnumItem<'a> {
    item: &'a IrErrorEnumItem
}

impl GenerateCode for ErrorEnumItem<'_> {
    fn generate_code(&self) -> proc_macro2::TokenStream {
        let item_enum = self.item;
        let enum_ident = &self.item.ident;
        let arms = &self
            .item
            .variants
            .iter()
            .flat_map(|v| {
                let ident = &v.ident;
                let msg = &v.ident.to_string().to_case(Case::Title);
                let code = &v.expr;
                quote::quote! {
                    #enum_ident::#ident => odra::types::ExecutionError::new(#code, #msg),
                }
            })
            .collect::<TokenStream>();

        quote::quote! {
            #[odra::odra_error]
            #[derive(Debug, PartialEq, Eq, Clone, Copy)]
            #item_enum

            impl From<#enum_ident> for odra::types::ExecutionError {
                fn from(value: #enum_ident) -> Self {
                    match value {
                        #arms
                    }
                }
            }
        }
    }
}

#[derive(From)]
pub struct OdraErrorItem<'a> {
    item: &'a syn::ItemEnum
}

impl GenerateCode for OdraErrorItem<'_> {
    fn generate_code(&self) -> proc_macro2::TokenStream {
        let item_enum = &self.item;
        let ident = &self.item.ident;

        quote::quote! {
            #item_enum

            impl From<#ident> for odra::types::OdraError {
                fn from(value: #ident) -> Self {
                    odra::types::OdraError::ExecutionError(value.into())
                }
            }
        }
    }
}