use heck::ToSnakeCase;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use super::{
common::{gen_print_section, get_idl_module_path, get_no_docs},
defined::gen_idl_type,
};
use crate::parser::docs;
pub fn gen_idl_print_fn_constant(item: &syn::ItemConst) -> TokenStream {
let idl = get_idl_module_path();
let no_docs = get_no_docs();
let name = item.ident.to_string();
let expr = &item.expr;
let fn_name = format_ident!("__sol_private_print_idl_const_{}", name.to_snake_case());
let fn_name_test = format_ident!("{}__test", fn_name);
let slice_entry = format_ident!(
"__SOL_IDL_ENTRY_CONST_{}",
name.to_snake_case().to_uppercase()
);
let docs = match docs::parse(&item.attrs) {
Some(docs) if !no_docs => quote! { vec![#(#docs.into()),*] },
_ => quote! { vec![] },
};
let fn_body = match gen_idl_type(&item.ty, &[]) {
Ok((ty, _)) => gen_print_section(
"const",
quote! {
#idl::IdlConst {
name: #name.into(),
docs: #docs,
ty: #ty,
value: format!("{:?}", #expr),
}
},
),
_ => quote! {},
};
quote! {
#[doc(hidden)]
#[cfg(feature = "idl-build")]
pub fn #fn_name() {
#fn_body
}
#[cfg(feature = "idl-build")]
#[allow(unsafe_code)]
#[rialo_sol_lang::linkme::distributed_slice(rialo_sol_lang::__SOL_IDL_PRINT_FNS)]
#[linkme(crate = rialo_sol_lang::linkme)]
#[doc(hidden)]
static #slice_entry: (fn(), &'static str) = (#fn_name, module_path!());
#[cfg(feature = "idl-build")]
#[test]
fn #fn_name_test() {
#fn_name();
}
}
}