anchor_syn/idl/
error.rs

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}