schema 0.1.0

Access the schema for a Rust item
Documentation
# schema -- A Generic Schema Derivation for Rust

This crate is pretty simple in concept: it exposes a trait, `Schema`, and a
derive macro for that trait. The trait has a single method, `Schema::schema()`,
that produces a struct of type `syn::DeriveInput` (which this crate re-exports)
that represents the schema for the type on which `schema()` is invoked.

```rust
#[derive(Schema)]
struct MyType {
    a: u32,
}
```

If we `println!("{:#?}", MyType::schema())` we get:

```
DeriveInput {
    attrs: [],
    vis: Inherited,
    ident: Ident(
        MyType,
    ),
    generics: Generics {
        lt_token: None,
        params: [],
        gt_token: None,
        where_clause: None,
    },
    data: Struct(
        DataStruct {
            struct_token: Struct,
            fields: Named(
                FieldsNamed {
                    brace_token: Brace,
                    named: [
                        Field {
                            attrs: [],
                            vis: Inherited,
                            ident: Some(
                                Ident(
                                    a,
                                ),
                            ),
                            colon_token: Some(
                                Colon,
                            ),
                            ty: Path(
                                TypePath {
                                    qself: None,
                                    path: Path {
                                        leading_colon: None,
                                        segments: [
                                            PathSegment {
                                                ident: Ident(
                                                    u32,
                                                ),
                                                arguments: None,
                                            },
                                        ],
                                    },
                                },
                            ),
                        },
                    ],
                },
            ),
            semi_token: None,
        },
    ),
}
```

---

## FAQ

### 1. Ok, so what is this for?

Right. I'm not 100% sure. It seems potentially useful for developing or testing
proc macros. It also seems useful in situations where one might make a proc
macro but can't be bothered to deal with defining a trait on a bunch of base
types.

### 2. Why did you make this?

Fair. I was doing some work with OpenAPI and JSON Schema and found it
surprising I couldn't find a generic schema crate, something that provided a
subset of Java reflection, say.

I found someone squatting on the name `schema` on crates.io. "Aha!" I thought,
"I'll teach that evil squatter a lesson!" So I mailed him and he responded in
the worst possible way: "okay, I sent an invite." Suddenly I was the evil squatter.

Months passed as they do.

I had the odd idea of a derive macro that parsed an item and then teleported
that structure from proc macro context into program context. I usually want an
actual use case to drive a project, but this seemed like a *neat* trick. It led
to weird code like this (i.e. not exactly this):

```rust
impl Teleporter for TokenStream {
    fn teleport(&self) -> TokenStream {
        quote! {
            quote! {
                #self
            }
        }
    }

    //...
}
```

I'm not really sure what this crate is or if it's useful, but it was an
interesting experiment. If you find it useful, have a different idea for how it
should work, or just think `schema` should be a totally different crate: let me
know.

### 3. I'm using it and...

Please tell me about what you're doing with it... you were saying...

### 4. ... I'm seeing an error on some type

Please file an issue. PRs welcome too.