tensor_amm/hooked/
nullable.rs1use 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}