constants.rs 856 B

12345678910111213141516171819202122232425262728
  1. use anchor_lang_idl::types::{Idl, IdlType};
  2. use quote::{format_ident, quote, ToTokens};
  3. use super::common::convert_idl_type_to_syn_type;
  4. pub fn gen_constants_mod(idl: &Idl) -> proc_macro2::TokenStream {
  5. let constants = idl.constants.iter().map(|c| {
  6. let name = format_ident!("{}", c.name);
  7. let val = syn::parse_str::<syn::Expr>(&c.value)
  8. .unwrap()
  9. .to_token_stream();
  10. let (ty, val) = match &c.ty {
  11. IdlType::Bytes => (quote!(&[u8]), quote! { &#val }),
  12. IdlType::String => (quote!(&str), val),
  13. _ => (convert_idl_type_to_syn_type(&c.ty).to_token_stream(), val),
  14. };
  15. // TODO: Docs
  16. quote! { pub const #name: #ty = #val; }
  17. });
  18. quote! {
  19. /// Program constants.
  20. pub mod constants {
  21. #(#constants)*
  22. }
  23. }
  24. }