use std::fmt::Display;
use syn::{meta::ParseNestedMeta, Ident, LitStr, Result};
#[derive(Clone)]
pub enum HandlerKind {
Query,
Mutation,
Subscription,
}
impl Display for HandlerKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
HandlerKind::Query => "Query",
HandlerKind::Mutation => "Mutation",
HandlerKind::Subscription => "Subscription",
}
)
}
}
pub struct HandlerOptions {
pub kind: HandlerKind,
pub name: Option<Ident>,
}
impl HandlerOptions {
pub fn builder() -> HandlerOptionsBuilder {
HandlerOptionsBuilder::default()
}
}
#[derive(Default)]
pub struct HandlerOptionsBuilder {
pub kind: Option<HandlerKind>,
pub name: Option<Ident>,
}
impl HandlerOptionsBuilder {
pub fn parse(&mut self, meta: ParseNestedMeta) -> Result<()> {
if meta.path.is_ident("query") {
self.kind = Some(HandlerKind::Query);
Ok(())
} else if meta.path.is_ident("mutation") {
self.kind = Some(HandlerKind::Mutation);
Ok(())
} else if meta.path.is_ident("subscription") {
self.kind = Some(HandlerKind::Subscription);
Ok(())
} else if meta.path.is_ident("name") {
let name = meta.value()?.parse::<LitStr>()?.value();
let ident = Ident::new(&name, meta.input.span());
self.name = Some(ident);
Ok(())
} else {
Err(meta.error("unsupported handler property"))
}
}
pub fn build(self) -> Option<HandlerOptions> {
Some(HandlerOptions {
kind: self.kind?,
name: self.name,
})
}
}