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}