Add option types for top-level commands

This commit is contained in:
jude
2024-02-18 11:04:43 +00:00
parent c1305cfb36
commit 5e39e16060
22 changed files with 395 additions and 268 deletions

View File

@ -68,3 +68,90 @@ pub fn footer(ctx: Context<'_>) -> CreateEmbedFooter {
pub trait Extract {
fn extract(ctx: ApplicationContext) -> Self;
}
pub use extract_macro::Extract;
macro_rules! extract_arg {
($ctx:ident, $name:ident, String) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map_or_else(
|| String::new(),
|v| match v {
poise::serenity_prelude::ResolvedValue::String(s) => s.to_string(),
_ => String::new(),
},
)
};
($ctx:ident, $name:ident, Option<String>) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map(|v| match v {
poise::serenity_prelude::ResolvedValue::String(s) => Some(s.to_string()),
_ => None,
})
.flatten()
};
($ctx:ident, $name:ident, bool) => {
$ctx.args.iter().find(|opt| opt.name == stringify!($name)).map(|opt| &opt.value).map_or(
false,
|v| match v {
poise::serenity_prelude::ResolvedValue::Boolean(b) => b.to_owned(),
_ => false,
},
)
};
($ctx:ident, $name:ident, Option<bool>) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map(|v| match v {
poise::serenity_prelude::ResolvedValue::Boolean(b) => Some(b.to_owned()),
_ => None,
})
.flatten()
};
($ctx:ident, $name:ident, Option<PartialChannel>) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map(|v| match v {
poise::serenity_prelude::ResolvedValue::Channel(partial) => {
Some(partial.to_owned())
}
_ => None,
})
.flatten()
.cloned()
};
($ctx:ident, $name:ident, i64) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map(|v| match v {
poise::serenity_prelude::ResolvedValue::Integer(int) => *int,
_ => 0,
})
.flatten()
};
($ctx:ident, $name:ident, Option<i64>) => {
$ctx.args
.iter()
.find(|opt| opt.name == stringify!($name))
.map(|opt| &opt.value)
.map(|v| match v {
poise::serenity_prelude::ResolvedValue::Integer(int) => Some(*int),
_ => None,
})
.flatten()
};
}
pub(crate) use extract_arg;