use async_trait::async_trait; use pumpkin_data::Enchantment; use pumpkin_protocol::java::client::play::{ArgumentType, CommandSuggestion, SuggestionProviders}; use crate::command::{ CommandSender, args::{ Arg, ArgumentConsumer, ConsumedArgs, DefaultNameArgConsumer, FindArg, GetClientSideArgParser, }, dispatcher::CommandError, tree::RawArgs, }; use crate::server::Server; pub struct EnchantmentArgumentConsumer; impl GetClientSideArgParser for EnchantmentArgumentConsumer { fn get_client_side_parser(&self) -> ArgumentType<'_> { ArgumentType::Resource { identifier: "enchantment", } } fn get_client_side_suggestion_type_override(&self) -> Option { None } } #[async_trait] impl ArgumentConsumer for EnchantmentArgumentConsumer { async fn consume<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, args: &mut RawArgs<'a>, ) -> Option> { let name = args.pop()?; // Create a static damage type first let enchantment = Enchantment::from_name(name)?; // Find matching static damage type from values array Some(Arg::Enchantment(enchantment)) } async fn suggest<'a>( &'a self, _sender: &CommandSender, _server: &'a Server, _input: &'a str, ) -> Result>, CommandError> { Ok(None) } } impl DefaultNameArgConsumer for EnchantmentArgumentConsumer { fn default_name(&self) -> &'static str { "enchantment" } } impl<'a> FindArg<'a> for EnchantmentArgumentConsumer { type Data = &'a Enchantment; fn find_arg(args: &'a ConsumedArgs, name: &str) -> Result { match args.get(name) { Some(Arg::Enchantment(data)) => Ok(data), _ => Err(CommandError::InvalidConsumption(Some(name.to_string()))), } } }