solana_binary_encoder/
option_serializer.rs1use serde::{ser::Error, Deserialize, Deserializer, Serialize, Serializer};
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub enum OptionSerializer<T> {
5 Some(T),
6 None,
7 Skip,
8}
9
10impl<T> OptionSerializer<T> {
11 pub fn none() -> Self {
12 Self::None
13 }
14
15 pub fn skip() -> Self {
16 Self::Skip
17 }
18
19 pub fn should_skip(&self) -> bool {
20 matches!(self, Self::Skip)
21 }
22
23 pub fn or_skip(option: Option<T>) -> Self {
24 match option {
25 Option::Some(item) => Self::Some(item),
26 Option::None => Self::Skip,
27 }
28 }
29
30 pub fn as_ref(&self) -> OptionSerializer<&T> {
31 match self {
32 OptionSerializer::Some(item) => OptionSerializer::Some(item),
33 OptionSerializer::None => OptionSerializer::None,
34 OptionSerializer::Skip => OptionSerializer::Skip,
35 }
36 }
37}
38
39impl<T> From<Option<T>> for OptionSerializer<T> {
40 fn from(option: Option<T>) -> Self {
41 match option {
42 Option::Some(item) => Self::Some(item),
43 Option::None => Self::None,
44 }
45 }
46}
47
48impl<T> From<OptionSerializer<T>> for Option<T> {
49 fn from(option: OptionSerializer<T>) -> Self {
50 match option {
51 OptionSerializer::Some(item) => Self::Some(item),
52 _ => Self::None,
53 }
54 }
55}
56
57impl<T: Serialize> Serialize for OptionSerializer<T> {
58 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
59 where
60 S: Serializer,
61 {
62 match self {
63 Self::Some(item) => item.serialize(serializer),
64 Self::None => serializer.serialize_none(),
65 Self::Skip => Err(Error::custom("Skip variants should not be serialized")),
66 }
67 }
68}
69
70impl<'de, T: Deserialize<'de>> Deserialize<'de> for OptionSerializer<T> {
71 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
72 where
73 D: Deserializer<'de>,
74 {
75 Option::deserialize(deserializer).map(Into::into)
76 }
77}