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

73 lines
2.3 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::model::prelude::application_command::{
ApplicationCommandInteractionDataOption, ApplicationCommandInteractionDataOptionValue,
};
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()))
}