use crate::signature::SignatureBuilder;
use crate::{ObjectPath, Signature, Storable, WriteAligned};
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub enum Variant<'de> {
Bool(bool),
U8(u8),
I16(i16),
U16(u16),
I32(i32),
U32(u32),
I64(i64),
U64(u64),
F64(f64),
String(&'de str),
ObjectPath(&'de ObjectPath),
Signature(&'de Signature),
}
impl Variant<'_> {
pub fn contained_signature(&self) -> &'static Signature {
match self {
Variant::Bool(..) => Signature::BOOLEAN,
Variant::U8(..) => Signature::BYTE,
Variant::I16(..) => Signature::INT16,
Variant::U16(..) => Signature::UINT16,
Variant::I32(..) => Signature::INT32,
Variant::U32(..) => Signature::UINT32,
Variant::I64(..) => Signature::INT64,
Variant::U64(..) => Signature::UINT64,
Variant::F64(..) => Signature::DOUBLE,
Variant::String(..) => Signature::STRING,
Variant::ObjectPath(..) => Signature::OBJECT_PATH,
Variant::Signature(..) => Signature::SIGNATURE,
}
}
}
impl crate::storable::sealed::Sealed for Variant<'_> {}
impl Storable for Variant<'_> {
#[inline]
fn store_to<B>(self, buf: &mut B)
where
B: ?Sized + WriteAligned,
{
buf.write_only(self.contained_signature());
match self {
Variant::Bool(value) => buf.store_frame(u32::from(value)),
Variant::U8(value) => buf.store_frame(value),
Variant::I16(value) => buf.store_frame(value),
Variant::U16(value) => buf.store_frame(value),
Variant::I32(value) => buf.store_frame(value),
Variant::U32(value) => buf.store_frame(value),
Variant::I64(value) => buf.store_frame(value),
Variant::U64(value) => buf.store_frame(value),
Variant::F64(value) => buf.store_frame(value),
Variant::String(value) => buf.write_only(value),
Variant::ObjectPath(value) => buf.write_only(value),
Variant::Signature(value) => buf.write_only(value),
}
}
#[inline]
fn write_signature(builder: &mut SignatureBuilder) -> bool {
builder.extend_from_signature(Signature::VARIANT)
}
}