1use core::{
4 cmp::Ordering,
5 hash,
6 ops::{Deref, DerefMut},
7};
8
9use crate::{seal::Seal, Portable};
10
11#[derive(Debug, Portable)]
14#[rkyv(crate)]
15#[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
16#[repr(u8)]
17pub enum ArchivedResult<T, E> {
18 Ok(T),
20 Err(E),
22}
23
24impl<T, E> ArchivedResult<T, E> {
25 pub fn ok(self) -> Option<T> {
27 match self {
28 ArchivedResult::Ok(value) => Some(value),
29 ArchivedResult::Err(_) => None,
30 }
31 }
32 pub fn unwrap(self) -> T {
35 match self {
36 ArchivedResult::Ok(value) => value,
37 ArchivedResult::Err(_) => {
38 panic!("called `ArchivedResult::unwrap()` on an `Err` value")
39 }
40 }
41 }
42 pub fn unwrap_or_else<F>(self, op: F) -> T
44 where
45 F: FnOnce(E) -> T,
46 {
47 match self {
48 ArchivedResult::Ok(t) => t,
49 ArchivedResult::Err(e) => op(e),
50 }
51 }
52 pub const fn is_ok(&self) -> bool {
54 matches!(self, ArchivedResult::Ok(_))
55 }
56
57 pub const fn is_err(&self) -> bool {
59 matches!(self, ArchivedResult::Err(_))
60 }
61
62 pub fn as_ref(&self) -> Result<&T, &E> {
65 match self {
66 ArchivedResult::Ok(value) => Ok(value),
67 ArchivedResult::Err(err) => Err(err),
68 }
69 }
70
71 pub fn as_mut(&mut self) -> Result<&mut T, &mut E> {
73 match self {
74 ArchivedResult::Ok(value) => Ok(value),
75 ArchivedResult::Err(err) => Err(err),
76 }
77 }
78
79 pub fn as_seal(this: Seal<'_, Self>) -> Result<Seal<'_, T>, Seal<'_, E>> {
82 let this = unsafe { Seal::unseal_unchecked(this) };
83 match this {
84 ArchivedResult::Ok(value) => Ok(Seal::new(value)),
85 ArchivedResult::Err(err) => Err(Seal::new(err)),
86 }
87 }
88
89 pub fn iter(&self) -> Iter<&'_ T> {
94 Iter::new(self.as_ref().ok())
95 }
96
97 pub fn iter_mut(&mut self) -> Iter<&'_ mut T> {
102 Iter::new(self.as_mut().ok())
103 }
104
105 pub fn iter_seal(this: Seal<'_, Self>) -> Iter<Seal<'_, T>> {
110 Iter::new(Self::as_seal(this).ok())
111 }
112}
113
114impl<T: Deref, E> ArchivedResult<T, E> {
115 pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E> {
121 match self {
122 ArchivedResult::Ok(value) => Ok(value.deref()),
123 ArchivedResult::Err(err) => Err(err),
124 }
125 }
126}
127
128impl<T: DerefMut, E> ArchivedResult<T, E> {
129 pub fn as_deref_mut(
135 &mut self,
136 ) -> Result<&mut <T as Deref>::Target, &mut E> {
137 match self {
138 ArchivedResult::Ok(value) => Ok(value.deref_mut()),
139 ArchivedResult::Err(err) => Err(err),
140 }
141 }
142}
143
144pub type Iter<P> = crate::option::Iter<P>;
150
151impl<T: Eq, E: Eq> Eq for ArchivedResult<T, E> {}
152
153impl<T: hash::Hash, E: hash::Hash> hash::Hash for ArchivedResult<T, E> {
154 fn hash<H: hash::Hasher>(&self, state: &mut H) {
155 self.as_ref().hash(state)
156 }
157}
158
159impl<T: Ord, E: Ord> Ord for ArchivedResult<T, E> {
160 fn cmp(&self, other: &Self) -> Ordering {
161 self.as_ref().cmp(&other.as_ref())
162 }
163}
164
165impl<T: PartialEq, E: PartialEq> PartialEq for ArchivedResult<T, E> {
166 fn eq(&self, other: &Self) -> bool {
167 self.as_ref().eq(&other.as_ref())
168 }
169}
170
171impl<T: PartialOrd, E: PartialOrd> PartialOrd for ArchivedResult<T, E> {
172 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
173 self.as_ref().partial_cmp(&other.as_ref())
174 }
175}
176
177impl<T, U, E, F> PartialEq<Result<T, E>> for ArchivedResult<U, F>
178where
179 U: PartialEq<T>,
180 F: PartialEq<E>,
181{
182 fn eq(&self, other: &Result<T, E>) -> bool {
183 match self {
184 ArchivedResult::Ok(self_value) => {
185 if let Ok(other_value) = other {
186 self_value.eq(other_value)
187 } else {
188 false
189 }
190 }
191 ArchivedResult::Err(self_err) => {
192 if let Err(other_err) = other {
193 self_err.eq(other_err)
194 } else {
195 false
196 }
197 }
198 }
199 }
200}