use proc_macro2::TokenStream;
use quote::quote;
use sourcegen_cli::tokens::{NewLine, PlainComment};
use sourcegen_cli::SourceGenerator;
pub struct WriteBack;
impl SourceGenerator for WriteBack {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
Ok(Some(quote! {
#item
}))
}
fn generate_enum(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemEnum,
) -> Result<Option<TokenStream>, anyhow::Error> {
Ok(Some(quote! {
#item
}))
}
fn generate_mod(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemMod,
) -> Result<Option<TokenStream>, anyhow::Error> {
Ok(Some(quote! {
#item
}))
}
}
pub struct GenerateImpls;
impl SourceGenerator for GenerateImpls {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#vis struct #ident;
#[sourcegen::generated]
impl #ident {}
}))
}
}
pub struct GenerateSimple;
impl SourceGenerator for GenerateSimple {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#vis struct #ident {
pub hello: String,
}
}))
}
}
pub struct GenerateDocComments;
impl SourceGenerator for GenerateDocComments {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#vis struct #ident {
pub hello: String,
}
}))
}
}
pub struct GenerateFile;
impl SourceGenerator for GenerateFile {
fn generate_file(
&self,
_args: syn::AttributeArgs,
_file: &syn::File,
) -> Result<Option<TokenStream>, anyhow::Error> {
Ok(Some(quote! {
#[doc = r" Some generated comment here"]
struct Hello {
pub hello: String,
}
}))
}
}
pub struct GeneratePlainComments;
impl SourceGenerator for GeneratePlainComments {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#PlainComment "This is some struct!"
#vis struct #ident {
#PlainComment "This is some field!"
pub hello: String,
}
}))
}
}
pub struct GenerateNewLine;
impl SourceGenerator for GenerateNewLine {
fn generate_struct(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemStruct,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#vis struct #ident;
#NewLine
impl #ident {}
}))
}
}
pub struct GenerateTrait;
impl SourceGenerator for GenerateTrait {
fn generate_trait(
&self,
_args: syn::AttributeArgs,
item: &syn::ItemTrait,
) -> Result<Option<TokenStream>, anyhow::Error> {
let vis = &item.vis;
let ident = &item.ident;
Ok(Some(quote! {
#vis trait #ident {
fn hello();
}
}))
}
}