Geoffrey-rs/geoffrey_bot/src/bot/arg_parse.rs

124 lines
3.9 KiB
Rust

use crate::bot::commands::CommandError;
use geoffrey_models::models::locations::LocationType;
use geoffrey_models::models::parameters::selling_params::{ItemSort, Order};
use geoffrey_models::models::Dimension;
use serenity::builder::CreateApplicationCommandOption;
use serenity::model::prelude::application_command::{
ApplicationCommandInteractionDataOption, ApplicationCommandInteractionDataOptionValue,
ApplicationCommandOptionType,
};
use std::str::FromStr;
pub fn option_to_i64(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<i64, CommandError> {
if let Some(option) = option {
let option = option.resolved.as_ref();
if let Some(ApplicationCommandInteractionDataOptionValue::Integer(i)) = option {
return Ok(*i);
}
}
Err(CommandError::ArgumentParse(field.to_string()))
}
pub fn option_to_string(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<String, CommandError> {
if let Some(option) = option {
let option = option.resolved.as_ref();
if let Some(ApplicationCommandInteractionDataOptionValue::String(s)) = option {
return Ok(s.clone());
}
}
Err(CommandError::ArgumentParse(field.to_string()))
}
pub fn option_to_loc_type(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<LocationType, CommandError> {
let loc_type = option_to_string(option, field)?;
LocationType::from_str(&loc_type).map_err(|_| CommandError::ArgumentParse(field.to_string()))
}
pub fn option_to_dim(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<Dimension, CommandError> {
let loc_type = option_to_string(option, field)?;
Dimension::from_str(&loc_type).map_err(|_| CommandError::ArgumentParse(field.to_string()))
}
pub fn option_to_sort(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<ItemSort, CommandError> {
let loc_type = option_to_string(option, field)?;
ItemSort::from_str(&loc_type).map_err(|_| CommandError::ArgumentParse(field.to_string()))
}
pub fn option_to_order(
option: Option<&ApplicationCommandInteractionDataOption>,
field: &str,
) -> Result<Order, CommandError> {
let loc_type = option_to_string(option, field)?;
Order::from_str(&loc_type).map_err(|_| CommandError::ArgumentParse(field.to_string()))
}
pub fn add_x_position_argument(
option: &mut CreateApplicationCommandOption,
) -> &mut CreateApplicationCommandOption {
option
.name("x")
.description("X coordinate")
.kind(ApplicationCommandOptionType::Integer)
.max_int_value(i32::MAX)
.min_int_value(i32::MIN)
.required(true)
}
pub fn add_y_position_argument(
option: &mut CreateApplicationCommandOption,
) -> &mut CreateApplicationCommandOption {
option
.name("y")
.description("Y Coordinate")
.kind(ApplicationCommandOptionType::Integer)
.max_int_value(i32::MAX)
.min_int_value(i32::MIN)
.required(true)
}
pub fn add_z_position_argument(
option: &mut CreateApplicationCommandOption,
) -> &mut CreateApplicationCommandOption {
option
.name("z")
.description("Z Coordinate")
.kind(ApplicationCommandOptionType::Integer)
.max_int_value(i32::MAX)
.min_int_value(i32::MIN)
.required(true)
}
pub fn add_dimension_argument(
option: &mut CreateApplicationCommandOption,
) -> &mut CreateApplicationCommandOption {
option
.name("dimension")
.description("Dimension of the shop, default is Overworld")
.kind(ApplicationCommandOptionType::String)
.add_string_choice(Dimension::Overworld, Dimension::Overworld)
.add_string_choice(Dimension::Nether, Dimension::Nether)
.add_string_choice(Dimension::TheEnd, Dimension::TheEnd)
.required(false)
}