#![deny(
warnings,
missing_debug_implementations,
rust_2018_idioms,
nonstandard_style,
future_incompatible,
clippy::all,
clippy::suspicious,
clippy::style,
clippy::complexity,
clippy::perf,
clippy::pedantic
)]
#![allow(clippy::doc_markdown, clippy::missing_panics_doc)]
#![forbid(unsafe_code)]
mod generation;
mod traversal;
use proc_macro::TokenStream;
use syn::Ident;
enum Case {
Lower,
Upper,
Unchanged,
}
struct TagData {
ident: Ident,
case: Case,
}
enum Tag {
Unit(TagData),
Unnamed(TagData),
Named(TagData),
}
struct TaggedUnion {
name: Ident,
tags: Vec<Tag>,
}
#[proc_macro_derive(TagName, attributes(tag))]
pub fn tagname_derive(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap();
let traversed = traversal::traverse_ast(ast);
if let Err(e) = traversed {
return e.0.into();
}
generation::generate_code(traversed.unwrap())
}