use std::str::FromStr; use async_trait::async_trait; use pumpkin_protocol::java::client::play::{ArgumentType, CommandSuggestion, SuggestionProviders}; use pumpkin_util::GameMode; use crate::{ command::{CommandSender, dispatcher::CommandError, tree::RawArgs}, server::Server, }; use super::{Arg, ArgumentConsumer, DefaultNameArgConsumer, FindArg, GetClientSideArgParser}; pub struct GamemodeArgumentConsumer; impl GetClientSideArgParser for GamemodeArgumentConsumer { fn get_client_side_parser(&self) -> ArgumentType<'_> { ArgumentType::Gamemode } fn get_client_side_suggestion_type_override(&self) -> Option { None } } #[async_trait] impl ArgumentConsumer for GamemodeArgumentConsumer { async fn consume<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, args: &mut RawArgs<'a>, ) -> Option> { let s = args.pop()?; if let Ok(id) = s.parse::() && let Ok(gamemode) = GameMode::try_from(id) { return Some(Arg::GameMode(gamemode)); } GameMode::from_str(s).map_or_else(|_| None, |gamemode| Some(Arg::GameMode(gamemode))) } async fn suggest<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, _input: &'a str, ) -> Result>, CommandError> { Ok(None) } } impl DefaultNameArgConsumer for GamemodeArgumentConsumer { fn default_name(&self) -> &'static str { "gamemode" } } impl<'a> FindArg<'a> for GamemodeArgumentConsumer { type Data = GameMode; fn find_arg(args: &'a super::ConsumedArgs, name: &str) -> Result { match args.get(name) { Some(Arg::GameMode(data)) => Ok(*data), _ => Err(CommandError::InvalidConsumption(Some(name.to_string()))), } } }