use async_trait::async_trait; use pumpkin_protocol::client::play::{ ArgumentType, CommandSuggestion, StringProtoArgBehavior, SuggestionProviders, }; use crate::{command::dispatcher::CommandError, server::Server}; use super::{ super::{ args::{ArgumentConsumer, RawArgs}, CommandSender, }, Arg, DefaultNameArgConsumer, FindArg, GetClientSideArgParser, }; /// Consumes all remaining words/args. Does not consume if there is no word. pub struct MsgArgConsumer; impl GetClientSideArgParser for MsgArgConsumer { fn get_client_side_parser(&self) -> ArgumentType { ArgumentType::String(StringProtoArgBehavior::GreedyPhrase) } fn get_client_side_suggestion_type_override(&self) -> Option { None } } #[async_trait] impl ArgumentConsumer for MsgArgConsumer { async fn consume<'a>( &'a self, _sender: &CommandSender<'a>, _server: &'a Server, args: &mut RawArgs<'a>, ) -> Option> { let mut msg = args.pop()?.to_string(); while let Some(word) = args.pop() { msg.push(' '); msg.push_str(word); } Some(Arg::Msg(msg)) } async fn suggest<'a>( &'a self, _sender: &CommandSender<'a>, _server: &'a Server, _input: &'a str, ) -> Result>, CommandError> { Ok(None) } } impl DefaultNameArgConsumer for MsgArgConsumer { fn default_name(&self) -> &'static str { "msg" } } impl<'a> FindArg<'a> for MsgArgConsumer { type Data = &'a str; fn find_arg(args: &'a super::ConsumedArgs, name: &str) -> Result { match args.get(name) { Some(Arg::Msg(data)) => Ok(data), _ => Err(CommandError::InvalidConsumption(Some(name.to_string()))), } } }