osom_lib_primitives/
cresult.rs1use core::{mem::forget, ptr};
4
5use osom_lib_reprc::{macros::reprc, traits::ReprC};
6
7#[reprc]
21#[repr(u8)]
22#[derive(Debug)]
23#[must_use]
24pub enum CResult<TOk, TErr>
25where
26 TOk: ReprC,
27 TErr: ReprC,
28{
29 Ok(TOk) = 0,
30 Err(TErr) = 1,
31}
32
33impl<TOk, TErr> CResult<TOk, TErr>
34where
35 TOk: ReprC,
36 TErr: ReprC,
37{
38 #[inline(always)]
41 pub const fn is_ok(&self) -> bool {
42 match self {
43 CResult::Ok(_) => true,
44 CResult::Err(_) => false,
45 }
46 }
47
48 #[inline(always)]
51 pub const fn is_err(&self) -> bool {
52 !self.is_ok()
53 }
54
55 #[inline(always)]
61 pub const fn unwrap(self) -> TOk {
62 match &self {
63 CResult::Ok(ok) => {
64 let data = unsafe { ptr::read(ok) };
65 forget(self);
66 data
67 }
68 CResult::Err(_) => {
69 panic!("called `CResult::unwrap()` on an `Err` value.");
70 }
71 }
72 }
73
74 #[inline(always)]
81 pub const unsafe fn unwrap_unchecked(self) -> TOk {
82 match &self {
83 CResult::Ok(ok) => {
84 let data = unsafe { ptr::read(ok) };
85 forget(self);
86 data
87 }
88 CResult::Err(_) => {
89 unsafe { core::hint::unreachable_unchecked() };
90 }
91 }
92 }
93
94 #[inline(always)]
100 pub const fn unwrap_err(self) -> TErr {
101 match &self {
102 CResult::Ok(_) => {
103 panic!("called `CResult::unwrap_err()` on an `Ok` value.");
104 }
105 CResult::Err(err) => {
106 let data = unsafe { ptr::read(err) };
107 forget(self);
108 data
109 }
110 }
111 }
112
113 #[inline(always)]
120 pub const unsafe fn unwrap_err_unchecked(self) -> TErr {
121 match &self {
122 CResult::Ok(_) => {
123 unsafe { core::hint::unreachable_unchecked() };
124 }
125 CResult::Err(err) => {
126 let data = unsafe { ptr::read(err) };
127 forget(self);
128 data
129 }
130 }
131 }
132
133 #[allow(clippy::missing_errors_doc)]
134 #[inline(always)]
136 pub const fn into_result(self) -> Result<TOk, TErr> {
137 match &self {
138 CResult::Ok(ok) => {
139 let data = unsafe { ptr::read(ok) };
140 forget(self);
141 Ok(data)
142 }
143 CResult::Err(err) => {
144 let data = unsafe { ptr::read(err) };
145 forget(self);
146 Err(data)
147 }
148 }
149 }
150
151 #[inline(always)]
153 pub const fn from_result(result: Result<TOk, TErr>) -> Self {
154 match &result {
155 Ok(ok) => {
156 let data = unsafe { ptr::read(ok) };
157 forget(result);
158 Self::Ok(data)
159 }
160 Err(err) => {
161 let data = unsafe { ptr::read(err) };
162 forget(result);
163 Self::Err(data)
164 }
165 }
166 }
167}
168
169impl<TOk, TErr> From<CResult<TOk, TErr>> for Result<TOk, TErr>
170where
171 TOk: ReprC,
172 TErr: ReprC,
173{
174 fn from(value: CResult<TOk, TErr>) -> Self {
175 value.into_result()
176 }
177}
178
179impl<TOk, TErr> From<Result<TOk, TErr>> for CResult<TOk, TErr>
180where
181 TOk: ReprC,
182 TErr: ReprC,
183{
184 fn from(value: Result<TOk, TErr>) -> Self {
185 Self::from_result(value)
186 }
187}