introspection/
lib.rs

1#[cfg(feature = "serde_support")]
2#[macro_use]
3extern crate serde_derive;
4#[cfg(feature = "serde_support")]
5extern crate serde_json;
6extern crate syn;
7extern crate quote;
8
9#[derive(Debug, Clone)]
10#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
11pub enum Visibility {
12    Public,
13    Crate,
14    Restricted(String),
15    Inherited
16}
17impl From<syn::Visibility> for Visibility {
18    fn from(v: syn::Visibility) -> Visibility {
19        use quote::{ Tokens, ToTokens };
20        match v {
21            syn::Visibility::Public => Visibility::Public,
22            syn::Visibility::Crate => Visibility::Crate,
23            syn::Visibility::Restricted(path) => {
24                let mut tokens = Tokens::new();
25                path.to_tokens(&mut tokens);
26                Visibility::Restricted(tokens.as_str().to_owned())
27            },
28            syn::Visibility::Inherited => Visibility::Inherited,
29        }
30    }
31}
32impl quote::ToTokens for Visibility {
33    fn to_tokens(&self, tokens: &mut quote::Tokens) {
34        match *self {
35            Visibility::Public => tokens.append("introspection::Visibility::Public"),
36            Visibility::Crate => tokens.append("introspection::Visibility::Crate"),
37            Visibility::Restricted(ref path) => {
38                tokens.append("introspection::Visibility::Restricted(\"");
39                tokens.append(&path);
40                tokens.append("\".to_owned())");
41            },
42            Visibility::Inherited => tokens.append("introspection::Visibility::Inherited"),
43        }
44    }
45}
46
47#[derive(Debug, Clone)]
48#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
49pub enum Type {
50    Enum,
51    Struct,
52}
53impl quote::ToTokens for Type {
54    fn to_tokens(&self, tokens: &mut quote::Tokens) {
55        match *self {
56            Type::Enum => tokens.append("introspection::Type::Enum"),
57            Type::Struct => tokens.append("introspection::Type::Struct"),
58        }
59    }
60}
61
62#[derive(Debug, Clone)]
63#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
64pub struct IntrospectionInfo {
65    pub ident: String,
66    pub visibility: Visibility,
67    pub entity_type: Type,
68    pub fields: Vec<String>,
69}
70
71pub trait Introspection {
72    fn introspection() -> IntrospectionInfo;
73}