Function wiggle_generate::names::flag_member
source · Examples found in repository?
src/types/flags.rs (line 18)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
pub(super) fn define_flags(
name: &witx::Id,
repr: witx::IntRepr,
record: &witx::RecordDatatype,
) -> TokenStream {
let ident = names::type_(&name);
let abi_repr = names::wasm_type(repr.into());
let repr = super::int_repr_tokens(repr);
let mut names_ = vec![];
let mut values_ = vec![];
for (i, member) in record.members.iter().enumerate() {
let name = names::flag_member(&member.name);
let value_token = Literal::usize_unsuffixed(1 << i);
names_.push(name);
values_.push(value_token);
}
quote! {
wiggle::bitflags::bitflags! {
pub struct #ident: #repr {
#(const #names_ = #values_;)*
}
}
impl ::std::fmt::Display for #ident {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
f.write_str(stringify!(#ident))?;
f.write_str("(")?;
::std::fmt::Debug::fmt(self, f)?;
f.write_str(" (0x")?;
::std::fmt::LowerHex::fmt(&self.bits, f)?;
f.write_str("))")?;
Ok(())
}
}
impl TryFrom<#repr> for #ident {
type Error = wiggle::GuestError;
fn try_from(value: #repr) -> Result<Self, wiggle::GuestError> {
if #repr::from(!#ident::all()) & value != 0 {
Err(wiggle::GuestError::InvalidFlagValue(stringify!(#ident)))
} else {
Ok(#ident { bits: value })
}
}
}
impl TryFrom<#abi_repr> for #ident {
type Error = wiggle::GuestError;
fn try_from(value: #abi_repr) -> Result<Self, wiggle::GuestError> {
#ident::try_from(#repr::try_from(value)?)
}
}
impl From<#ident> for #repr {
fn from(e: #ident) -> #repr {
e.bits
}
}
impl<'a> wiggle::GuestType<'a> for #ident {
fn guest_size() -> u32 {
#repr::guest_size()
}
fn guest_align() -> usize {
#repr::guest_align()
}
fn read(location: &wiggle::GuestPtr<#ident>) -> Result<#ident, wiggle::GuestError> {
use std::convert::TryFrom;
let reprval = #repr::read(&location.cast())?;
let value = #ident::try_from(reprval)?;
Ok(value)
}
fn write(location: &wiggle::GuestPtr<'_, #ident>, val: Self) -> Result<(), wiggle::GuestError> {
let val: #repr = #repr::from(val);
#repr::write(&location.cast(), val)
}
}
}
}