use syn;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Repr {
None,
C,
U8,
U16,
U32,
USize,
I8,
I16,
I32,
ISize,
}
impl Repr {
pub fn load(attrs: &Vec<syn::Attribute>) -> Repr {
if Repr::has_attr(Repr::repr_c(), attrs) {
Repr::C
} else if Repr::has_attr(Repr::repr_usize(), attrs) {
Repr::USize
} else if Repr::has_attr(Repr::repr_u32(), attrs) {
Repr::U32
} else if Repr::has_attr(Repr::repr_u16(), attrs) {
Repr::U16
} else if Repr::has_attr(Repr::repr_u8(), attrs) {
Repr::U8
} else if Repr::has_attr(Repr::repr_isize(), attrs) {
Repr::ISize
} else if Repr::has_attr(Repr::repr_i32(), attrs) {
Repr::I32
} else if Repr::has_attr(Repr::repr_i16(), attrs) {
Repr::I16
} else if Repr::has_attr(Repr::repr_i8(), attrs) {
Repr::I8
} else {
Repr::None
}
}
fn has_attr(meta: syn::MetaItem, attrs: &Vec<syn::Attribute>) -> bool {
attrs.iter().any(|x| !x.is_sugared_doc && x.value == meta)
}
fn repr_c() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("C")))])
}
fn repr_usize() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("usize")))])
}
fn repr_u32() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("u32")))])
}
fn repr_u16() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("u16")))])
}
fn repr_u8() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("u8")))])
}
fn repr_isize() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("isize")))])
}
fn repr_i32() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i32")))])
}
fn repr_i16() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i16")))])
}
fn repr_i8() -> syn::MetaItem {
syn::MetaItem::List(syn::Ident::new("repr"),
vec![syn::NestedMetaItem::MetaItem(syn::MetaItem::Word(syn::Ident::new("i8")))])
}
}