123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- extern crate proc_macro;
- use proc_macro::TokenStream;
- use syn::{parse, parse_macro_input, DeriveInput, ItemImpl};
- use args::{Casts, Flag, Targets};
- use gen_caster::generate_caster;
- mod args;
- mod gen_caster;
- mod item_impl;
- mod item_type;
- #[proc_macro_attribute]
- pub fn cast_to(args: TokenStream, input: TokenStream) -> TokenStream {
- match parse::<Targets>(args) {
- Ok(Targets { flags, paths }) => {
- if paths.is_empty() {
- item_impl::process(&flags, parse_macro_input!(input as ItemImpl))
- } else {
- item_type::process(&flags, paths, parse_macro_input!(input as DeriveInput))
- }
- }
- Err(err) => vec![err.to_compile_error(), input.into()]
- .into_iter()
- .collect(),
- }
- .into()
- }
- #[proc_macro]
- pub fn castable_to(input: TokenStream) -> TokenStream {
- let Casts {
- ty,
- targets: Targets { flags, paths },
- } = parse_macro_input!(input);
- paths
- .iter()
- .map(|t| generate_caster(&ty, t, flags.contains(&Flag::Sync)))
- .collect::<proc_macro2::TokenStream>()
- .into()
- }
|