event.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. use heck::SnakeCase;
  2. use proc_macro2::TokenStream;
  3. use quote::{format_ident, quote};
  4. use super::{
  5. common::{gen_print_section, get_idl_module_path, get_serde_json_module_path},
  6. defined::gen_idl_type_def_struct,
  7. };
  8. pub fn gen_idl_print_fn_event(event_struct: &syn::ItemStruct) -> TokenStream {
  9. let idl = get_idl_module_path();
  10. let serde_json = get_serde_json_module_path();
  11. let ident = &event_struct.ident;
  12. let fn_name = format_ident!(
  13. "__anchor_private_print_idl_event_{}",
  14. ident.to_string().to_snake_case()
  15. );
  16. let idl_build_impl = impl_idl_build_event(event_struct);
  17. let print_ts = gen_print_section(
  18. "event",
  19. quote! {
  20. #serde_json::json!({
  21. "event": event,
  22. "types": types.into_values().collect::<Vec<_>>()
  23. })
  24. },
  25. );
  26. quote! {
  27. #idl_build_impl
  28. #[test]
  29. pub fn #fn_name() {
  30. let mut types: std::collections::BTreeMap<String, #idl::IdlTypeDef> =
  31. std::collections::BTreeMap::new();
  32. if let Some(event) = #ident::__anchor_private_gen_idl_event(&mut types) {
  33. #print_ts
  34. }
  35. }
  36. }
  37. }
  38. /// Generate IDL build impl for an event.
  39. fn impl_idl_build_event(event_struct: &syn::ItemStruct) -> TokenStream {
  40. let idl = get_idl_module_path();
  41. let ident = &event_struct.ident;
  42. let (impl_generics, ty_generics, where_clause) = event_struct.generics.split_for_impl();
  43. let fn_body = match gen_idl_type_def_struct(event_struct) {
  44. Ok((ts, defined)) => quote! {
  45. #(
  46. if let Some(ty) = <#defined>::create_type() {
  47. types.insert(<#defined>::get_full_path(), ty);
  48. <#defined>::insert_types(types);
  49. }
  50. );*
  51. let ty = #ts;
  52. let event = #idl::IdlEvent {
  53. name: ty.name.clone(),
  54. discriminator: <Self as anchor_lang::Discriminator>::DISCRIMINATOR.into(),
  55. };
  56. types.insert(ty.name.clone(), ty);
  57. Some(event)
  58. },
  59. _ => quote! { None },
  60. };
  61. quote! {
  62. impl #impl_generics #ident #ty_generics #where_clause {
  63. pub fn __anchor_private_gen_idl_event(
  64. types: &mut std::collections::BTreeMap<String, #idl::IdlTypeDef>,
  65. ) -> Option<#idl::IdlEvent> {
  66. #fn_body
  67. }
  68. }
  69. }
  70. }