1use crate::data::value::DamlValue;
2use crate::data::DamlResult;
3use crate::serialize::{DamlDeserializableType, DamlDeserializeFrom, DamlSerializableType, DamlSerializeFrom};
4
5pub trait Nat {
7 fn nat() -> u8;
8}
9
10macro_rules! make_nat {
12 ($name:ident, $n:literal) => {
13 make_nat_struct! {$name, $n}
14 make_nat_serializable_type! {$name}
15 make_nat_deserializable_type! {$name}
16 make_nat_serialize_from! {$name}
17 make_nat_deserialize_from! {$name}
18 };
19}
20
21macro_rules! make_nat_struct {
22 ($name:ident, $n:literal) => {
23 make_nat_struct! {@gen $name, $n, concat!("A type representing the natural number ", stringify!($n))}
24 };
25 (@gen $name:ident, $n:literal, $doc:expr) => {
26 #[doc = $doc]
27 #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone)]
28 pub struct $name {}
29 impl Nat for $name {
30 fn nat() -> u8 {
31 $n
32 }
33 }
34 };
35}
36
37macro_rules! make_nat_serializable_type {
38 ($name:ident) => {
39 impl DamlSerializableType for $name {}
40 };
41}
42
43macro_rules! make_nat_deserializable_type {
44 ($name:ident) => {
45 impl DamlDeserializableType for $name {}
46 };
47}
48
49macro_rules! make_nat_serialize_from {
50 ($name:ident) => {
51 impl DamlSerializeFrom<$name> for DamlValue {
52 fn serialize_from(_: $name) -> DamlValue {
53 Self::new_unit()
54 }
55 }
56 };
57}
58
59macro_rules! make_nat_deserialize_from {
60 ($name:ident) => {
61 impl DamlDeserializeFrom for $name {
62 fn deserialize_from(_: DamlValue) -> DamlResult<Self> {
63 Ok($name {})
64 }
65 }
66 };
67}
68
69make_nat! {Nat0, 0}
70make_nat! {Nat1, 1}
71make_nat! {Nat2, 2}
72make_nat! {Nat3, 3}
73make_nat! {Nat4, 4}
74make_nat! {Nat5, 5}
75make_nat! {Nat6, 6}
76make_nat! {Nat7, 7}
77make_nat! {Nat8, 8}
78make_nat! {Nat9, 9}
79make_nat! {Nat10, 10}
80make_nat! {Nat11, 11}
81make_nat! {Nat12, 12}
82make_nat! {Nat13, 13}
83make_nat! {Nat14, 14}
84make_nat! {Nat15, 15}
85make_nat! {Nat16, 16}
86make_nat! {Nat17, 17}
87make_nat! {Nat18, 18}
88make_nat! {Nat19, 19}
89make_nat! {Nat20, 20}
90make_nat! {Nat21, 21}
91make_nat! {Nat22, 22}
92make_nat! {Nat23, 23}
93make_nat! {Nat24, 24}
94make_nat! {Nat25, 25}
95make_nat! {Nat26, 26}
96make_nat! {Nat27, 27}
97make_nat! {Nat28, 28}
98make_nat! {Nat29, 29}
99make_nat! {Nat30, 30}
100make_nat! {Nat31, 31}
101make_nat! {Nat32, 32}
102make_nat! {Nat33, 33}
103make_nat! {Nat34, 34}
104make_nat! {Nat35, 35}
105make_nat! {Nat36, 36}
106make_nat! {Nat37, 37}