use crate::command::CommandSender; use crate::command::args::{Arg, ArgumentConsumer, FindArg, GetClientSideArgParser}; use crate::command::dispatcher::CommandError; use crate::command::tree::RawArgs; use crate::server::Server; use async_trait::async_trait; use pumpkin_protocol::java::client::play::{ArgumentType, CommandSuggestion, SuggestionProviders}; pub struct BoolArgConsumer; impl GetClientSideArgParser for BoolArgConsumer { fn get_client_side_parser(&self) -> ArgumentType<'_> { ArgumentType::Bool } fn get_client_side_suggestion_type_override(&self) -> Option { None } } #[async_trait] impl ArgumentConsumer for BoolArgConsumer { async fn consume<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, args: &mut RawArgs<'a>, ) -> Option> { let s = args.pop()?; match s { "false" => Some(Arg::Bool(false)), "true" => Some(Arg::Bool(true)), _ => None, } } async fn suggest<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, _input: &'a str, ) -> Result>, CommandError> { Ok(None) } } impl<'a> FindArg<'a> for BoolArgConsumer { type Data = bool; fn find_arg(args: &'a super::ConsumedArgs, name: &str) -> Result { match args.get(name) { Some(Arg::Bool(data)) => Ok(*data), _ => Err(CommandError::InvalidConsumption(Some(name.to_string()))), } } }