defuse_borsh_utils/
schema.rs1use 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}