-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathideal_gas.rs
More file actions
41 lines (37 loc) · 1.12 KB
/
ideal_gas.rs
File metadata and controls
41 lines (37 loc) · 1.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use quote::quote;
use syn::DeriveInput;
pub(crate) fn expand_ideal_gas(input: DeriveInput) -> syn::Result<proc_macro2::TokenStream> {
let variants = match input.data {
syn::Data::Enum(syn::DataEnum { ref variants, .. }) => variants,
_ => panic!("this derive macro only works on enums"),
};
let ideal_gas = impl_ideal_gas(variants);
Ok(quote! {
#ideal_gas
})
}
fn impl_ideal_gas(
variants: &syn::punctuated::Punctuated<syn::Variant, syn::token::Comma>,
) -> proc_macro2::TokenStream {
let ideal_gas_model = variants.iter().map(|v| {
let name = &v.ident;
if name == "NoModel" {
quote! {
Self::#name(_) => panic!("No ideal gas model initialized!")
}
} else {
quote! {
Self::#name(ideal_gas) => ideal_gas.ideal_gas_model()
}
}
});
quote! {
impl IdealGas for IdealGasModel {
fn ideal_gas_model(&self) -> &dyn DeBroglieWavelength {
match self {
#(#ideal_gas_model,)*
}
}
}
}
}