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// ```