Pumpkin/pumpkin/src/command/arg_position.rs
Snowiiii 9f70b95b9b Split commands into their own Folder
Now its much nicer separate from the command base
2024-10-29 22:47:52 +01:00

46 lines
1.3 KiB
Rust

use async_trait::async_trait;
use crate::command::dispatcher::InvalidTreeError;
use crate::command::tree::{ConsumedArgs, RawArgs};
use crate::command::CommandSender;
use crate::server::Server;
use super::tree::ArgumentConsumer;
/// TODO: Seperate base functionality of these two methods into single method
/// todo: implement (so far only own name + @s/@p is implemented)
pub(crate) struct PositionArgumentConsumer;
#[async_trait]
impl ArgumentConsumer for PositionArgumentConsumer {
async fn consume<'a>(
&self,
_src: &CommandSender<'a>,
_server: &Server,
args: &mut RawArgs<'a>,
) -> Result<String, Option<String>> {
let Some(arg) = args.pop() else {
return Err(None);
};
// TODO implement ~ ^ notations
let value = arg.parse::<f64>().map_err(|err| Some(err.to_string()))?;
Ok(value.to_string())
}
}
pub fn parse_arg_position(
arg_name: &str,
consumed_args: &ConsumedArgs<'_>,
) -> Result<f64, InvalidTreeError> {
let s = consumed_args
.get(arg_name)
.ok_or(InvalidTreeError::InvalidConsumptionError(None))?;
let value = s
.parse::<f64>()
.map_err(|err| InvalidTreeError::InvalidConsumptionError(Some(err.to_string())))?;
Ok(value)
}