Also refactor some things: - Remove cmd_ prefix from commands - Remove arg_ prefix from arguments
73 lines
1.8 KiB
Rust
73 lines
1.8 KiB
Rust
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<SuggestionProviders> {
|
|
None
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl ArgumentConsumer for MsgArgConsumer {
|
|
async fn consume<'a>(
|
|
&'a self,
|
|
_sender: &CommandSender<'a>,
|
|
_server: &'a Server,
|
|
args: &mut RawArgs<'a>,
|
|
) -> Option<Arg<'a>> {
|
|
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<Option<Vec<CommandSuggestion>>, 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<Self::Data, CommandError> {
|
|
match args.get(name) {
|
|
Some(Arg::Msg(data)) => Ok(data),
|
|
_ => Err(CommandError::InvalidConsumption(Some(name.to_string()))),
|
|
}
|
|
}
|
|
}
|