1use heck::SnakeCase;
2use proc_macro2::TokenStream;
3use quote::{format_ident, quote};
4
5use super::common::{gen_print_section, get_idl_module_path};
6use crate::Error;
7
8pub fn gen_idl_print_fn_error(error: &Error) -> TokenStream {
9 let idl = get_idl_module_path();
10
11 let fn_name = format_ident!(
12 "__anchor_private_print_idl_error_{}",
13 error.ident.to_string().to_snake_case()
14 );
15
16 let error_codes = error
17 .codes
18 .iter()
19 .map(|code| {
20 let id = code.id;
21 let name = code.ident.to_string();
22 let msg = match &code.msg {
23 Some(msg) => quote! { Some(#msg.into()) },
24 None => quote! { None },
25 };
26
27 quote! {
28 #idl::IdlErrorCode {
29 code: anchor_lang::error::ERROR_CODE_OFFSET + #id,
30 name: #name.into(),
31 msg: #msg,
32 }
33 }
34 })
35 .collect::<Vec<_>>();
36 let fn_body = gen_print_section("errors", quote! { vec![#(#error_codes),*] });
37
38 quote! {
39 #[test]
40 pub fn #fn_name() {
41 #fn_body
42 }
43 }
44}