Skip to content

Commit

Permalink
reorganise flags to be distict arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacherr committed Sep 16, 2024
1 parent 72ddd08 commit 0d0a787
Show file tree
Hide file tree
Showing 11 changed files with 492 additions and 113 deletions.
131 changes: 87 additions & 44 deletions assyst-core/src/command/arguments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub trait ParseArgument: Sized {
ctxt: &mut InteractionCommandParseCtxt<'_>,
label: Label,
) -> Result<Self, TagParseError>;
fn as_command_option(name: &str) -> CommandOption;
fn as_command_options(name: &str) -> Vec<CommandOption>;
fn usage(name: &str) -> String {
format!("<{name}>")
}
Expand Down Expand Up @@ -59,8 +59,8 @@ impl ParseArgument for i64 {
}
}

fn as_command_option(name: &str) -> CommandOption {
IntegerBuilder::new(name, "integer option").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![IntegerBuilder::new(name, "integer option").required(true).build()]
}
}

Expand All @@ -86,8 +86,8 @@ impl ParseArgument for u64 {
}
}

fn as_command_option(name: &str) -> CommandOption {
IntegerBuilder::new(name, "integer option").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![IntegerBuilder::new(name, "integer option").required(true).build()]
}
}

Expand All @@ -112,8 +112,8 @@ impl ParseArgument for f64 {
}
}

fn as_command_option(name: &str) -> CommandOption {
NumberBuilder::new(name, "number option").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![NumberBuilder::new(name, "number option").required(true).build()]
}
}

Expand All @@ -138,8 +138,8 @@ impl ParseArgument for f32 {
}
}

fn as_command_option(name: &str) -> CommandOption {
NumberBuilder::new(name, "number option").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![NumberBuilder::new(name, "number option").required(true).build()]
}
}

Expand All @@ -165,10 +165,10 @@ impl<T: ParseArgument> ParseArgument for Option<T> {
}
}

fn as_command_option(name: &str) -> CommandOption {
let mut option = T::as_command_option(name);
option.required = Some(false);
option
fn as_command_options(name: &str) -> Vec<CommandOption> {
let mut options = T::as_command_options(name);
options.iter_mut().for_each(|o| o.required = Some(false));
options
}

fn usage(name: &str) -> String {
Expand Down Expand Up @@ -205,8 +205,8 @@ impl ParseArgument for Vec<Word> {
Ok(items)
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "text input").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "text input").required(true).build()]
}

fn usage(name: &str) -> String {
Expand Down Expand Up @@ -241,11 +241,13 @@ impl ParseArgument for Vec<WordAutocomplete> {
Ok(items)
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "text input")
.autocomplete(true)
.required(true)
.build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![
StringBuilder::new(name, "text input")
.autocomplete(true)
.required(true)
.build(),
]
}

fn usage(name: &str) -> String {
Expand Down Expand Up @@ -284,8 +286,8 @@ impl ParseArgument for Time {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "time input").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "time input").required(true).build()]
}
}

Expand Down Expand Up @@ -314,8 +316,8 @@ impl ParseArgument for Word {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "word input").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "word input").required(true).build()]
}
}

Expand Down Expand Up @@ -344,11 +346,13 @@ impl ParseArgument for WordAutocomplete {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "word input")
.autocomplete(true)
.required(true)
.build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![
StringBuilder::new(name, "word input")
.autocomplete(true)
.required(true)
.build(),
]
}
}

Expand Down Expand Up @@ -382,8 +386,8 @@ impl ParseArgument for Codeblock {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "code argument").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "code argument").required(true).build()]
}
}

Expand Down Expand Up @@ -436,8 +440,8 @@ impl ParseArgument for User {
}
}

fn as_command_option(name: &str) -> CommandOption {
UserBuilder::new(name, "user argument").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![UserBuilder::new(name, "user argument").required(true).build()]
}
}

Expand Down Expand Up @@ -490,8 +494,8 @@ impl ParseArgument for Channel {
}
}

fn as_command_option(name: &str) -> CommandOption {
ChannelBuilder::new(name, "channel argument").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![ChannelBuilder::new(name, "channel argument").required(true).build()]
}
}

Expand Down Expand Up @@ -532,8 +536,8 @@ impl ParseArgument for Rest {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "text input").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "text input").required(true).build()]
}

fn usage(name: &str) -> String {
Expand Down Expand Up @@ -578,8 +582,8 @@ impl ParseArgument for RestNoFlags {
}
}

fn as_command_option(name: &str) -> CommandOption {
StringBuilder::new(name, "text input").required(true).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
vec![StringBuilder::new(name, "text input").required(true).build()]
}

fn usage(name: &str) -> String {
Expand Down Expand Up @@ -702,6 +706,22 @@ impl ImageUrl {
}
}

async fn from_link_interaction_command(
ctxt: &mut InteractionCommandParseCtxt<'_>,
label: Label,
) -> Result<Self, TagParseError> {
let word = &ctxt.option_by_name(&label.unwrap().0)?.value;

if let CommandOptionValue::String(option) = word {
Ok(Self(option.clone()))
} else {
Err(TagParseError::MismatchedCommandOptionType((
"Link".to_owned(),
word.clone(),
)))
}
}

/// This only exists for raw message
async fn from_reply(ctxt: &mut RawMessageParseCtxt<'_>, _: Label) -> Result<Self, TagParseError> {
let reply = ctxt
Expand Down Expand Up @@ -927,11 +947,18 @@ impl ParseArgument for ImageUrl {
};
}

let attachment_label = Some((
format!("{}-attachment", label.clone().unwrap().0),
label.clone().unwrap().1,
));
let link_label = Some((format!("{}-link", label.clone().unwrap().0), label.clone().unwrap().1));

handle!(commit_if_ok!(
ctxt,
ImageUrl::from_attachment_interaction_command,
label
attachment_label
));
handle!(commit_if_ok!(ctxt, ImageUrl::from_link_interaction_command, link_label));
handle!(commit_if_ok!(ctxt, ImageUrl::from_mention_command_option, label));
handle!(commit_if_ok!(ctxt, ImageUrl::from_url_argument_command_option, label));
handle!(commit_if_ok!(ctxt, ImageUrl::from_emoji_command_option, label));
Expand All @@ -953,8 +980,16 @@ impl ParseArgument for ImageUrl {
Ok(Self(url))
}

fn as_command_option(name: &str) -> CommandOption {
AttachmentBuilder::new(name, "attachment input").required(false).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
let attachment_name = format!("{name}-attachment");
let link_name = format!("{name}-link");

vec![
AttachmentBuilder::new(attachment_name, "attachment input")
.required(false)
.build(),
StringBuilder::new(link_name, "link input").required(false).build(),
]
}
}

Expand Down Expand Up @@ -990,7 +1025,15 @@ impl ParseArgument for Image {
Ok(Image(data))
}

fn as_command_option(name: &str) -> CommandOption {
AttachmentBuilder::new(name, "attachment input").required(false).build()
fn as_command_options(name: &str) -> Vec<CommandOption> {
let attachment_name = format!("{name}-attachment");
let link_name = format!("{name}-link");

vec![
AttachmentBuilder::new(attachment_name, "attachment input")
.required(false)
.build(),
StringBuilder::new(link_name, "link input").required(false).build(),
]
}
}
96 changes: 55 additions & 41 deletions assyst-core/src/command/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,63 @@ use std::collections::HashMap;
use anyhow::{bail, Context};

#[macro_export]
macro_rules! flag_parse_argument {
($s:ty) => {
impl $crate::command::arguments::ParseArgument for $s {
fn as_command_option(name: &str) -> twilight_model::application::command::CommandOption {
twilight_util::builder::command::StringBuilder::new(name, "flags input")
.required(false)
.build()
}
macro_rules! int_arg_u64 {
($ctxt:expr, $s:expr, $d:expr) => {{
let inner = $ctxt
.option_by_name($s)
.map(|o| o.value.clone())
.unwrap_or(twilight_model::application::interaction::application_command::CommandOptionValue::Integer($d));

async fn parse_raw_message(
ctxt: &mut $crate::command::RawMessageParseCtxt<'_>,
label: $crate::command::Label,
) -> Result<Self, $crate::command::TagParseError> {
let args = ctxt.rest_all(label);
let parsed = Self::from_str(&args).map_err(|x| $crate::command::TagParseError::FlagParseError(x))?;
Ok(parsed)
}
let inner =
if let twilight_model::application::interaction::application_command::CommandOptionValue::Integer(option) =
inner
{
option as u64
} else {
panic!("download {} wrong arg type", $s);
};

async fn parse_command_option(
ctxt: &mut $crate::command::InteractionCommandParseCtxt<'_>,
label: $crate::command::Label,
) -> Result<Self, $crate::command::TagParseError> {
let word = &ctxt.option_by_name(&label.unwrap().0);

if let Ok(option) = word {
if let twilight_model::application::interaction::application_command::CommandOptionValue::String(
ref option,
) = option.value
{
Ok(Self::from_str(&option[..])
.map_err(|x| $crate::command::TagParseError::FlagParseError(x))?)
} else {
Err($crate::command::TagParseError::MismatchedCommandOptionType((
"String (Flags)".to_owned(),
option.value.clone(),
)))
}
} else {
Ok(Self::default())
}
}
}
};
inner
}};
}

#[macro_export]
macro_rules! int_arg_u64_opt {
($ctxt:expr, $s:expr) => {{
let inner = $ctxt.option_by_name($s).map(|o| o.value.clone());

let inner = if let Ok(
twilight_model::application::interaction::application_command::CommandOptionValue::Integer(option),
) = inner
{
Some(option as u64)
} else {
None
};

inner
}};
}

#[macro_export]
macro_rules! int_arg_bool {
($ctxt:expr, $s:expr, $d:expr) => {{
let inner = $ctxt
.option_by_name($s)
.map(|o| o.value.clone())
.unwrap_or(twilight_model::application::interaction::application_command::CommandOptionValue::Boolean($d));

let inner =
if let twilight_model::application::interaction::application_command::CommandOptionValue::Boolean(option) =
inner
{
option
} else {
panic!("download {} wrong arg type", $s);
};

inner
}};
}

pub enum FlagType {
Expand Down
Loading

0 comments on commit 0d0a787

Please sign in to comment.