odos_sdk/types/
referral.rs1use std::fmt;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
24#[serde(transparent)]
25pub struct ReferralCode(u32);
26
27impl ReferralCode {
28 pub const NONE: Self = Self(0);
41
42 pub const fn new(code: u32) -> Self {
60 Self(code)
61 }
62
63 pub const fn code(&self) -> u32 {
74 self.0
75 }
76
77 pub const fn is_none(&self) -> bool {
88 self.0 == 0
89 }
90
91 pub const fn is_some(&self) -> bool {
102 self.0 != 0
103 }
104}
105
106impl Default for ReferralCode {
107 fn default() -> Self {
109 Self::NONE
110 }
111}
112
113impl fmt::Display for ReferralCode {
114 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
115 if self.is_none() {
116 write!(f, "None")
117 } else {
118 write!(f, "{}", self.0)
119 }
120 }
121}
122
123impl From<ReferralCode> for u32 {
124 fn from(code: ReferralCode) -> Self {
125 code.0
126 }
127}
128
129impl From<u32> for ReferralCode {
130 fn from(code: u32) -> Self {
131 Self(code)
132 }
133}
134
135#[cfg(test)]
136mod tests {
137 use super::*;
138
139 #[test]
140 fn test_none_constant() {
141 assert_eq!(ReferralCode::NONE.code(), 0);
142 assert!(ReferralCode::NONE.is_none());
143 assert!(!ReferralCode::NONE.is_some());
144 }
145
146 #[test]
147 fn test_new() {
148 let code = ReferralCode::new(42);
149 assert_eq!(code.code(), 42);
150 assert!(!code.is_none());
151 assert!(code.is_some());
152
153 let code = ReferralCode::new(0);
154 assert_eq!(code.code(), 0);
155 assert!(code.is_none());
156 assert!(!code.is_some());
157
158 let code = ReferralCode::new(u32::MAX);
159 assert_eq!(code.code(), u32::MAX);
160 assert!(code.is_some());
161 }
162
163 #[test]
164 fn test_default() {
165 let code = ReferralCode::default();
166 assert_eq!(code, ReferralCode::NONE);
167 assert_eq!(code.code(), 0);
168 }
169
170 #[test]
171 fn test_display() {
172 assert_eq!(format!("{}", ReferralCode::NONE), "None");
173 assert_eq!(format!("{}", ReferralCode::new(42)), "42");
174 assert_eq!(format!("{}", ReferralCode::new(1234)), "1234");
175 }
176
177 #[test]
178 fn test_conversions() {
179 let code = ReferralCode::new(42);
181 let value: u32 = code.into();
182 assert_eq!(value, 42);
183
184 let code: ReferralCode = 42u32.into();
186 assert_eq!(code.code(), 42);
187 }
188
189 #[test]
190 fn test_equality() {
191 assert_eq!(ReferralCode::new(42), ReferralCode::new(42));
192 assert_ne!(ReferralCode::new(42), ReferralCode::new(43));
193 assert_eq!(ReferralCode::NONE, ReferralCode::new(0));
194 }
195
196 #[test]
197 fn test_ordering() {
198 assert!(ReferralCode::new(1) < ReferralCode::new(2));
199 assert!(ReferralCode::new(100) > ReferralCode::new(50));
200 assert!(ReferralCode::NONE < ReferralCode::new(1));
201 }
202
203 #[test]
204 fn test_serialization() {
205 let code = ReferralCode::new(42);
206
207 let json = serde_json::to_string(&code).unwrap();
209 assert_eq!(json, "42");
210
211 let deserialized: ReferralCode = serde_json::from_str(&json).unwrap();
213 assert_eq!(deserialized.code(), 42);
214
215 let json = serde_json::to_string(&ReferralCode::NONE).unwrap();
217 assert_eq!(json, "0");
218 }
219}