schema-derive 0.2.1

derive macro for the schema crate
Documentation
use proc_macro2::TokenStream;
use quote::quote;

use crate::Teleporter;

impl<T> Teleporter for std::boxed::Box<T>
where
    T: Teleporter,
{
    fn teleport(&self) -> TokenStream {
        let t = self.as_ref().teleport();
        quote! {
            Box::new(#t)
        }
    }

    fn name() -> &'static str {
        "std::boxed::Box"
    }
}

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

    fn name() -> &'static str {
        "proc_macro2::TokenStream"
    }
}

impl<T> Teleporter for Vec<T>
where
    T: Teleporter,
{
    fn teleport(&self) -> proc_macro2::TokenStream {
        let tt = self.iter().map(|t| t.teleport());
        quote! {
            vec![
                #(
                    #tt,
                )*
            ]
        }
    }

    fn name() -> &'static str {
        "std::vec::Vec"
    }
}

impl<T> Teleporter for Option<T>
where
    T: Teleporter,
{
    fn teleport(&self) -> proc_macro2::TokenStream {
        match self {
            None => quote! {
                None
            },
            Some(t) => {
                let tt = t.teleport();
                quote! { Some(#tt) }
            }
        }
    }

    fn name() -> &'static str {
        "std::Option"
    }
}

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

    fn name() -> &'static str {
        "usize"
    }
}

impl<T, U> Teleporter for (T, U)
where
    T: Teleporter,
    U: Teleporter,
{
    fn teleport(&self) -> proc_macro2::TokenStream {
        let (t, u) = (self.0.teleport(), self.1.teleport());
        quote! {
            (#t, #u)
        }
    }

    fn name() -> &'static str {
        todo!()
    }
}