tensor_amm/hooked/
nullable.rs

1use std::fmt::{self, Display, Formatter};
2
3use borsh::{BorshDeserialize, BorshSerialize};
4use solana_program::pubkey::Pubkey;
5
6#[derive(BorshSerialize, BorshDeserialize, Clone, Copy, Debug, Eq, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct NullableAddress(Pubkey);
9
10impl NullableAddress {
11    pub fn new(value: Pubkey) -> Self {
12        Self(value)
13    }
14
15    pub fn to_option(&self) -> Option<Pubkey> {
16        if self.0 == Pubkey::default() {
17            None
18        } else {
19            Some(self.0)
20        }
21    }
22
23    pub fn none() -> Self {
24        Self(Pubkey::default())
25    }
26}
27
28impl Display for NullableAddress {
29    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
30        if self.0 == Pubkey::default() {
31            write!(f, "None")
32        } else {
33            write!(f, "{}", self.0)
34        }
35    }
36}
37
38pub type NullableU16 = NullableNumber<u16>;
39pub type NullableU64 = NullableNumber<u64>;
40
41#[derive(BorshSerialize, BorshDeserialize, Clone, Copy, Debug, Eq, PartialEq)]
42#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
43pub struct NullableNumber<T: BorshSerialize + BorshDeserialize + Default + PartialEq>(T);
44
45impl<T: BorshSerialize + BorshDeserialize + Default + PartialEq> NullableNumber<T> {
46    pub fn new(value: T) -> Self {
47        Self(value)
48    }
49
50    pub fn into_base(self) -> T {
51        self.0
52    }
53
54    pub fn to_option(&self) -> Option<&T> {
55        if self.0 == T::default() {
56            None
57        } else {
58            Some(&self.0)
59        }
60    }
61
62    pub fn none() -> Self {
63        Self(T::default())
64    }
65}
66
67impl Display for NullableNumber<u64> {
68    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
69        if self.0 == 0 {
70            write!(f, "None")
71        } else {
72            write!(f, "{}", self.0)
73        }
74    }
75}