1use std::{fmt, marker::PhantomData};
2
3use crate::sealed::Sealed;
4
5
6pub trait OptionalField: Sealed {
16 #[doc(hidden)]
17 type Storage<T: fmt::Debug + Copy>: FieldStorage<T>;
18}
19
20#[allow(missing_debug_implementations)]
22pub enum StoreField {}
23impl Sealed for StoreField {}
24impl OptionalField for StoreField {
25 type Storage<T: fmt::Debug + Copy> = StoredField<T>;
26}
27
28#[allow(missing_debug_implementations)]
30pub enum OmitField {}
31impl Sealed for OmitField {}
32impl OptionalField for OmitField {
33 type Storage<T: fmt::Debug + Copy> = OmittedField<T>;
34}
35
36pub trait FieldStorage<T>: From<T> + fmt::Debug + Copy {
37 fn into_option(self) -> Option<T>;
38}
39
40#[derive(Clone, Copy, Debug)]
41pub struct StoredField<T>(T);
42
43impl<T: Copy + fmt::Debug> FieldStorage<T> for StoredField<T> {
44 #[inline(always)]
45 fn into_option(self) -> Option<T> {
46 Some(self.0)
47 }
48}
49
50impl<T> From<T> for StoredField<T> {
51 #[inline(always)]
52 fn from(value: T) -> Self {
53 Self(value)
54 }
55}
56
57#[derive(Clone, Copy, Debug)]
58pub struct OmittedField<T>(PhantomData<T>);
59
60impl<T: Copy + fmt::Debug> FieldStorage<T> for OmittedField<T> {
61 #[inline(always)]
62 fn into_option(self) -> Option<T> {
63 None
64 }
65}
66
67impl<T> From<T> for OmittedField<T> {
68 #[inline(always)]
69 fn from(_: T) -> Self {
70 Self(PhantomData)
71 }
72}