1use super::*;
2use sqlx_pg_uint_macros::UIntWrapper;
3
4use crate::UIntType;
5
6impl UIntType for PgU8 {
7 type Uint = u8;
8}
9
10impl private::Sealed for PgU8 {}
11
12#[derive(Debug, PartialEq, Eq, Clone, Hash, PartialOrd, Ord, UIntWrapper, sqlx::FromRow)]
13pub struct PgU8 {
15 inner: BigDecimal,
16}
17
18impl From<PgU8> for u8 {
19 fn from(value: PgU8) -> Self {
20 value.inner.to_string().parse().unwrap()
21 }
22}
23
24impl From<u8> for PgU8 {
25 fn from(value: u8) -> Self {
26 Self {
27 inner: BigDecimal::from(value),
28 }
29 }
30}
31
32#[cfg(test)]
33mod pg_u8_tests {
34 use bigdecimal::num_bigint::BigInt;
35
36 use super::*;
37
38 #[test]
39 fn test_to_u8() {
40 let pg_u8 = PgU8::from(121u8);
41 assert_eq!(pg_u8.to_uint(), 121u8);
42 let pg_u8 = PgU8::from(0);
43 assert_eq!(pg_u8.to_uint(), 0u8);
44 let pg_u8 = PgU8::from(u8::MAX);
45 assert_eq!(pg_u8.to_uint(), u8::MAX);
46 }
47
48 #[test]
49 fn test_add() {
50 let pg_u8 = PgU8::from(12u8);
51 let pg_u82 = PgU8::from(12u8);
52 assert_eq!((pg_u8 + pg_u82).to_uint(), 24u8);
53
54 let pg_u8 = PgU8::from(0u8);
55 let pg_u82 = PgU8::from(0u8);
56 assert_eq!((pg_u8 + pg_u82).to_uint(), 0u8);
57 }
58
59 #[test]
60 #[should_panic]
61 fn test_add_overflow() {
62 let pg_u8 = PgU8::from(u8::MAX);
63 let pg_u82 = PgU8::from(1u8);
64 let _ = pg_u8 + pg_u82;
65 }
66
67 #[test]
68 #[should_panic]
69 fn test_add_underflow() {
70 let pg_u8 = PgU8::from(0u8);
71 let pg_u82 = PgU8::from(1u8);
72 let _ = pg_u8 - pg_u82;
73 }
74
75 #[test]
76 fn try_from_bigdecimal() {
77 let pg_u8 = PgU8::try_from(BigDecimal::from(126u8)).unwrap();
78 assert_eq!(pg_u8.to_uint(), 126u8);
79
80 let pg_u8 = PgU8::try_from(BigDecimal::from(0)).unwrap();
81 assert_eq!(pg_u8.to_uint(), 0u8);
82
83 let pg_u8 = PgU8::try_from(BigDecimal::from(u8::MAX)).unwrap();
84 assert_eq!(pg_u8.to_uint(), u8::MAX);
85
86 let pg_u8 = PgU8::try_from(BigDecimal::from(-1));
87 assert!(pg_u8.is_err());
88 let err = pg_u8.unwrap_err();
89 assert_eq!(err, Error::InvalidValue(BigDecimal::from(-1)));
90
91 let fractional = BigDecimal::from(3) / BigDecimal::from(2);
92 let pg_u8 = PgU8::try_from(fractional.clone());
93 assert_eq!(pg_u8.unwrap_err(), Error::Fractional(fractional));
94
95 let big_decimal = BigDecimal::from(BigInt::from(2).pow(128));
96 let pg_u8 = PgU8::try_from(big_decimal.clone());
97 assert_eq!(pg_u8.unwrap_err(), Error::InvalidValue(big_decimal));
98 }
99
100 #[test]
101 fn test_option_conversion() {
102 let somepguint = Some(PgU8::from(123u8));
103 let someuint = somepguint.to_option_uint();
104 assert_eq!(someuint, Some(123u8));
105
106 let pguint = PgU8::from(123);
107 let someuint = pguint.to_option_uint();
108 assert_eq!(someuint, Some(123u8));
109
110 let pguint: Option<PgU8> = None;
111 let someuint = pguint.to_option_uint();
112 assert_eq!(someuint, None::<u8>);
113 }
114}