protobuf2/
message_field.rs1use std::default::Default;
2use std::hash::Hash;
3use std::ops::Deref;
4use std::option;
5
6use crate::Message;
7
8#[derive(Clone, Debug, Eq, PartialEq, Hash)]
34pub struct MessageField<T>(pub Option<Box<T>>);
35
36impl<T> MessageField<T> {
37 #[inline]
39 pub fn some(value: T) -> MessageField<T> {
40 MessageField(Some(Box::new(value)))
41 }
42
43 #[inline]
45 pub const fn none() -> MessageField<T> {
46 MessageField(None)
47 }
48
49 #[inline]
51 pub fn from_option(option: Option<T>) -> MessageField<T> {
52 match option {
53 Some(x) => MessageField::some(x),
54 None => MessageField::none(),
55 }
56 }
57
58 #[inline]
60 pub fn is_some(&self) -> bool {
61 self.0.is_some()
62 }
63
64 #[inline]
66 pub fn is_none(&self) -> bool {
67 self.0.is_none()
68 }
69
70 #[inline]
72 pub fn into_option(self) -> Option<T> {
73 self.0.map(|v| *v)
74 }
75
76 #[inline]
78 pub fn as_ref(&self) -> Option<&T> {
79 self.0.as_ref().map(|v| &**v)
80 }
81
82 #[inline]
84 pub fn as_mut(&mut self) -> Option<&mut T> {
85 self.0.as_mut().map(|v| &mut **v)
86 }
87
88 #[inline]
91 pub fn unwrap(self) -> T {
92 *self.0.unwrap()
93 }
94
95 #[inline]
97 pub fn unwrap_or(self, def: T) -> T {
98 self.0.map(|v| *v).unwrap_or(def)
99 }
100
101 #[inline]
103 pub fn unwrap_or_else<F>(self, f: F) -> T
104 where
105 F: FnOnce() -> T,
106 {
107 self.0.map(|v| *v).unwrap_or_else(f)
108 }
109
110 #[inline]
113 pub fn map<U, F>(self, f: F) -> MessageField<U>
114 where
115 F: FnOnce(T) -> U,
116 {
117 MessageField::from_option(self.into_option().map(f))
118 }
119
120 #[inline]
122 pub fn iter(&self) -> option::IntoIter<&T> {
123 self.as_ref().into_iter()
124 }
125
126 #[inline]
128 pub fn mut_iter(&mut self) -> option::IntoIter<&mut T> {
129 self.as_mut().into_iter()
130 }
131
132 #[inline]
134 pub fn take(&mut self) -> Option<T> {
135 self.0.take().map(|v| *v)
136 }
137
138 #[inline]
140 pub fn clear(&mut self) {
141 self.0 = None;
142 }
143}
144
145impl<T: Default> MessageField<T> {
146 #[inline]
148 pub fn unwrap_or_default(self) -> T {
149 *self.0.unwrap_or_default()
150 }
151}
152
153impl<M: Message> MessageField<M> {
154 pub fn get_or_default(&self) -> &M {
156 self.as_ref().unwrap_or_else(|| M::default_instance())
157 }
158
159 pub fn mut_or_insert_default(&mut self) -> &mut M {
161 if self.is_none() {
162 *self = MessageField::some(Default::default());
163 }
164 self.as_mut().unwrap()
165 }
166}
167
168impl<M: Message> Deref for MessageField<M> {
170 type Target = M;
171
172 fn deref(&self) -> &Self::Target {
173 self.get_or_default()
174 }
175}
176
177#[cfg(no)]
182impl<M: Message> DerefMut for MessageField<M> {
183 fn deref_mut(&mut self) -> &mut Self::Target {
184 self.mut_or_insert_default()
185 }
186}
187
188impl<T> Default for MessageField<T> {
189 #[inline]
190 fn default() -> MessageField<T> {
191 MessageField::none()
192 }
193}
194
195impl<T> From<Option<T>> for MessageField<T> {
198 fn from(o: Option<T>) -> Self {
199 MessageField::from_option(o)
200 }
201}
202
203impl<'a, T> IntoIterator for &'a MessageField<T> {
204 type Item = &'a T;
205 type IntoIter = option::IntoIter<&'a T>;
206
207 fn into_iter(self) -> option::IntoIter<&'a T> {
208 self.iter()
209 }
210}