Skip to main content

defuse_borsh_utils/
schema.rs

1use super::As;
2use borsh::schema::{Declaration, Definition};
3use std::collections::BTreeMap;
4
5pub trait BorshSchemaAs<T: ?Sized> {
6    fn declaration_as() -> Declaration;
7    fn add_definitions_recursively_as(definitions: &mut BTreeMap<Declaration, Definition>);
8}
9
10macro_rules! impl_borsh_schema_as {
11    ($target:ty, $adapter:ident) => {
12        impl<I> $crate::BorshSchemaAs<$target> for $adapter<I>
13        where
14            I: borsh::BorshSchema,
15        {
16            fn declaration_as() -> borsh::schema::Declaration {
17                <I as borsh::BorshSchema>::declaration()
18            }
19
20            fn add_definitions_recursively_as(
21                definitions: &mut std::collections::BTreeMap<
22                    borsh::schema::Declaration,
23                    borsh::schema::Definition,
24                >,
25            ) {
26                <I as borsh::BorshSchema>::add_definitions_recursively(definitions);
27            }
28        }
29    };
30}
31pub(crate) use impl_borsh_schema_as;
32
33impl<T: ?Sized> As<T> {
34    pub fn declaration<U: ?Sized>() -> Declaration
35    where
36        T: BorshSchemaAs<U>,
37    {
38        T::declaration_as()
39    }
40
41    pub fn add_definitions_recursively<U: ?Sized>(
42        definitions: &mut BTreeMap<Declaration, Definition>,
43    ) where
44        T: BorshSchemaAs<U>,
45    {
46        T::add_definitions_recursively_as(definitions);
47    }
48}