abi_stable_derive/stable_abi/
reflection.rs

1use super::SharedVars;
2
3use syn::Ident;
4
5#[derive(Debug, Copy, Clone, PartialEq, Eq)]
6pub enum FieldAccessor<'a> {
7    /// Accessible with `self.field_name`
8    Direct,
9    /// Accessible with `fn field_name(&self)->FieldType`
10    Method { name: Option<&'a Ident> },
11    /// Accessible with `fn field_name(&self)->Option<FieldType>`
12    MethodOption,
13    /// This field is completely inaccessible.
14    Opaque,
15}
16
17impl<'a> FieldAccessor<'a> {
18    pub(crate) fn compress(self, shared_vars: &mut SharedVars<'a>) -> CompFieldAccessor {
19        match self {
20            FieldAccessor::Direct => CompFieldAccessor::DIRECT,
21            FieldAccessor::Method { name: None } => CompFieldAccessor::METHOD,
22            FieldAccessor::Method { name: Some(name) } => {
23                let _ = shared_vars.push_ident(name);
24                CompFieldAccessor::METHOD_NAMED
25            }
26            FieldAccessor::MethodOption => CompFieldAccessor::METHOD_OPTION,
27            FieldAccessor::Opaque => CompFieldAccessor::OPAQUE,
28        }
29    }
30}
31
32abi_stable_shared::declare_comp_field_accessor! {
33    attrs=[]
34}
35
36////////////////////////////////////////////////////////////////////////////////
37
38#[derive(Debug, Copy, Clone, PartialEq, Eq)]
39pub enum ModReflMode<T> {
40    Module,
41    Opaque,
42    DelegateDeref(T),
43}