ex3_payload_derive/
lib.rs

1//! example to use
2//! ```
3//! #[derive(Eq, PartialEq, Debug, Ex3Payload)]
4//! struct PriceVolumePair {
5//!     #[index(0)]
6//!     price: BigUint,
7//!     #[index(1)]
8//!     volume: BigUint,
9//! }
10//!
11//! #[serde(transparent)]
12//! #[derive(Eq, PartialEq, Debug, Serialize, Deserialize)]
13//! struct MyStructId(String);
14//!
15//! #[derive(Eq, PartialEq, Debug, Copy, Clone, Ex3PayloadEnum)]
16//! enum OrderCategory {
17//!     SpotLimit = 0,
18//!     SpotMarket = 1,
19//!     SpotSwap = 2,
20//! }
21//!
22//! #[derive(Eq, PartialEq, Debug, Ex3Payload)]
23//! struct ComplexObject {
24//!     #[index(0)]
25//!     orders: Vec<PriceVolumePair>,
26//!     #[index(1)]
27//!     null_orders: Option<Vec<PriceVolumePair>>,
28//!     #[index(2)]
29//!     one_order: PriceVolumePair,
30//!     #[index(3)]
31//!     null_one_order: Option<PriceVolumePair>,
32//!     #[index(4)]
33//!     order_category: OrderCategory,
34//!     #[index(5)]
35//!     string_value: String,
36//!     #[index(6)]
37//!     null_string: Option<String>,
38//!     #[index(7)]
39//!     empty_string: String,
40//!     #[index(8)]
41//!     my_struct_id: MyStructId,
42//! }
43//! ```
44
45use syn;
46
47mod ex3_payload;
48mod ex3_payload_enum;
49
50#[proc_macro_derive(Ex3Payload, attributes(index, alias_of_big_uint))]
51pub fn ex3_payload_macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
52    let ast = syn::parse(input).unwrap();
53    proc_macro::TokenStream::from(ex3_payload::impl_ex3_payload_macro_derive(&ast))
54}
55
56#[proc_macro_derive(Ex3PayloadEnum)]
57pub fn ex3_payload_enum_macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
58    let ast = syn::parse(input).unwrap();
59    proc_macro::TokenStream::from(ex3_payload_enum::impl_ex3_payload_enum_macro_derive(&ast))
60}
61
62// code to handle BigUint
63// ```
64// use num_bigint::{BigInt, BigUint};
65// use ciborium::{de::from_reader, ser::into_writer};
66// use ciborium::tag::{Accepted, Captured, Required};
67// use serde::{Deserialize, Serialize};
68// use serde_bytes::{ByteBuf};
69// use serde::ser::{SerializeTuple, SerializeSeq, Serializer};
70// use serde::de::{Deserializer, SeqAccess, Visitor};
71// #[derive(Eq, PartialEq, Debug)]
72// struct Ex3Uint(BigUint);
73//
74// impl Serialize for Ex3Uint {
75//     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
76//         Captured(Some(2), ByteBuf::from(self.0.to_bytes_be())).serialize(serializer)
77//     }
78// }
79//
80// impl<'de> Deserialize<'de> for Ex3Uint {
81//     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
82//         let bytes: Captured<ByteBuf> = Deserialize::deserialize(deserializer)?;
83//         let value = BigUint::from_bytes_be(&bytes.1[..]);
84//         Ok(Ex3Uint(value))
85//     }
86// }
87// ```