1use crate::design::prelude::*;
2
3#[newtype(
8 primitive = "Nat16",
9 item(prim = "Nat16"),
10 ty(validator(path = "base::validator::num::Range", args(0, 360)))
11)]
12pub struct Degrees {}
13
14#[newtype(
21 primitive = "Nat8",
22 item(prim = "Nat8"),
23 ty(validator(path = "base::validator::num::Range", args(0, 100)))
24)]
25pub struct Percent {}
26
27#[newtype(
32 primitive = "Nat16",
33 item(prim = "Nat16"),
34 ty(validator(path = "base::validator::num::Range", args(0, 10_000)))
35)]
36pub struct PercentModifier {}
37
38#[record(
43 fields(
44 field(ident = "min", value(item(prim = "Decimal", scale = 18))),
45 field(ident = "max", value(item(prim = "Decimal", scale = 18))),
46 ),
47 traits(remove(ValidateCustom))
48)]
49pub struct DecimalRange {}
50
51impl DecimalRange {
52 #[must_use]
53 pub const fn new(min: Decimal, max: Decimal) -> Self {
54 Self { min, max }
55 }
56}
57
58impl ValidateCustom for DecimalRange {
59 fn validate_custom(&self, ctx: &mut dyn VisitorContext) {
60 let validator = base::validator::num::Lte::new(self.max);
61
62 validator.validate(&self.min, ctx);
63 }
64}
65
66#[record(
71 fields(
72 field(ident = "min", value(item(prim = "Duration"))),
73 field(ident = "max", value(item(prim = "Duration"))),
74 ),
75 traits(remove(ValidateCustom))
76)]
77pub struct DurationRange {}
78
79impl DurationRange {
80 #[must_use]
81 pub const fn new(min: Duration, max: Duration) -> Self {
82 Self { min, max }
83 }
84}
85
86impl ValidateCustom for DurationRange {
87 fn validate_custom(&self, ctx: &mut dyn VisitorContext) {
88 let validator = base::validator::num::Lte::new(self.max);
89
90 validator.validate(&self.min, ctx);
91 }
92}
93
94#[record(
99 fields(
100 field(ident = "min", value(item(prim = "Int32"))),
101 field(ident = "max", value(item(prim = "Int32"))),
102 ),
103 traits(remove(ValidateCustom))
104)]
105pub struct Int32Range {}
106
107impl Int32Range {
108 #[must_use]
109 pub const fn new(min: i32, max: i32) -> Self {
110 Self { min, max }
111 }
112}
113
114impl ValidateCustom for Int32Range {
115 fn validate_custom(&self, ctx: &mut dyn VisitorContext) {
116 let validator = base::validator::num::Lte::new(self.max);
117
118 validator.validate(&self.min, ctx);
119 }
120}
121
122#[record(
127 fields(
128 field(ident = "min", value(item(prim = "Nat32"))),
129 field(ident = "max", value(item(prim = "Nat32"))),
130 ),
131 traits(remove(ValidateCustom))
132)]
133pub struct Nat32Range {}
134
135impl Nat32Range {
136 #[must_use]
137 pub const fn new(min: u32, max: u32) -> Self {
138 Self { min, max }
139 }
140}
141
142impl ValidateCustom for Nat32Range {
143 fn validate_custom(&self, ctx: &mut dyn VisitorContext) {
144 let validator = base::validator::num::Lte::new(self.max);
145
146 validator.validate(&self.min, ctx);
147 }
148}