borsh_derive/internals/attributes/field/
bounds.rs
1use std::collections::BTreeMap;
2
3use syn::{meta::ParseNestedMeta, WherePredicate};
4
5use crate::internals::attributes::{parsing::parse_lit_into_vec, Symbol, DESERIALIZE, SERIALIZE};
6use once_cell::sync::Lazy;
7
8pub enum Variants {
9 Serialize(Vec<WherePredicate>),
10 Deserialize(Vec<WherePredicate>),
11}
12
13type ParseFn = dyn Fn(Symbol, Symbol, &ParseNestedMeta) -> syn::Result<Variants> + Send + Sync;
14
15pub static BOUNDS_FIELD_PARSE_MAP: Lazy<BTreeMap<Symbol, Box<ParseFn>>> = Lazy::new(|| {
16 let mut m = BTreeMap::new();
17 let f_serialize: Box<ParseFn> = Box::new(|attr_name, meta_item_name, meta| {
20 parse_lit_into_vec::<WherePredicate>(attr_name, meta_item_name, meta)
21 .map(Variants::Serialize)
22 });
23 let f_deserialize: Box<ParseFn> = Box::new(|attr_name, meta_item_name, meta| {
24 parse_lit_into_vec::<WherePredicate>(attr_name, meta_item_name, meta)
25 .map(Variants::Deserialize)
26 });
27 m.insert(SERIALIZE, f_serialize);
28 m.insert(DESERIALIZE, f_deserialize);
29 m
30});
31
32#[derive(Default, Clone)]
33pub struct Bounds {
34 pub serialize: Option<Vec<WherePredicate>>,
35 pub deserialize: Option<Vec<WherePredicate>>,
36}
37
38impl From<BTreeMap<Symbol, Variants>> for Bounds {
39 fn from(mut map: BTreeMap<Symbol, Variants>) -> Self {
40 let serialize = map.remove(&SERIALIZE);
41 let deserialize = map.remove(&DESERIALIZE);
42 let serialize = serialize.map(|variant| match variant {
43 Variants::Serialize(ser) => ser,
44 _ => unreachable!("only one enum variant is expected to correspond to given map key"),
45 });
46 let deserialize = deserialize.map(|variant| match variant {
47 Variants::Deserialize(de) => de,
48 _ => unreachable!("only one enum variant is expected to correspond to given map key"),
49 });
50 Self {
51 serialize,
52 deserialize,
53 }
54 }
55}