sqlx_pg_uint/
u8.rs

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)]
13/// PostgreSQL-compatible unsigned 8-bit integer
14pub 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}