use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
use syn::{
parse::{Parse, ParseStream},
token,
};
use crate::common::parse::ParseBufferExt as _;
#[derive(Clone, Debug, Default)]
pub(crate) enum Value {
#[default]
Default,
Expr(Box<syn::Expr>),
}
impl From<Option<syn::Expr>> for Value {
fn from(opt: Option<syn::Expr>) -> Self {
match opt {
Some(expr) => Self::Expr(Box::new(expr)),
None => Self::Default,
}
}
}
impl Parse for Value {
fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
Ok(input
.try_parse::<token::Eq>()?
.map(|_| input.parse::<syn::Expr>())
.transpose()?
.into())
}
}
impl ToTokens for Value {
fn to_tokens(&self, into: &mut TokenStream) {
match self {
Self::Default => quote! {
::std::default::Default::default()
},
Self::Expr(expr) => quote! {
(#expr).into()
},
}
.to_tokens(into)
}
}