1 2 3 4 5 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
#[cfg(feature = "serde_support")] #[macro_use] extern crate serde_derive; #[cfg(feature = "serde_support")] extern crate serde_json; extern crate syn; extern crate quote; #[derive(Debug, Clone)] #[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))] pub enum Visibility { Public, Crate, Restricted(String), Inherited } impl From<syn::Visibility> for Visibility { fn from(v: syn::Visibility) -> Visibility { use quote::{ Tokens, ToTokens }; match v { syn::Visibility::Public => Visibility::Public, syn::Visibility::Crate => Visibility::Crate, syn::Visibility::Restricted(path) => { let mut tokens = Tokens::new(); path.to_tokens(&mut tokens); Visibility::Restricted(tokens.as_str().to_owned()) }, syn::Visibility::Inherited => Visibility::Inherited, } } } impl quote::ToTokens for Visibility { fn to_tokens(&self, tokens: &mut quote::Tokens) { match *self { Visibility::Public => tokens.append("introspection::Visibility::Public"), Visibility::Crate => tokens.append("introspection::Visibility::Crate"), Visibility::Restricted(ref path) => { tokens.append("introspection::Visibility::Restricted(\""); tokens.append(&path); tokens.append("\".to_owned())"); }, Visibility::Inherited => tokens.append("introspection::Visibility::Inherited"), } } } #[derive(Debug, Clone)] #[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))] pub enum Type { Enum, Struct, } impl quote::ToTokens for Type { fn to_tokens(&self, tokens: &mut quote::Tokens) { match *self { Type::Enum => tokens.append("introspection::Type::Enum"), Type::Struct => tokens.append("introspection::Type::Struct"), } } } #[derive(Debug, Clone)] #[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))] pub struct IntrospectionInfo { pub ident: String, pub visibility: Visibility, pub entity_type: Type, pub fields: Vec<String>, } pub trait Introspection { fn introspection() -> IntrospectionInfo; }