Add macro for extracting arguments

This commit is contained in:
jude 2024-02-16 20:09:32 +00:00
parent b81c3c80c1
commit d0833b7bca
2 changed files with 60 additions and 37 deletions

View File

@ -38,3 +38,13 @@ SELECT
WHERE m1.id = m2.id
)
FROM macro m1;
# # Check which commands are used in macros
# SELECT DISTINCT command_name
# FROM macro m2
# JOIN JSON_TABLE(
# commands,
# '$[*]' COLUMNS (
# command_name VARCHAR(64) PATH '$.command_name' ERROR ON ERROR,
# options JSON PATH '$.options' ERROR ON ERROR
# )) AS t1

View File

@ -11,56 +11,69 @@ pub enum RecordedCommand {
Remind(RemindOptions),
}
macro_rules! extract_arg {
($ctx:ident, $name:literal, String) => {
$ctx.args.iter().find(|opt| opt.name == $name).map(|opt| &opt.value).map_or_else(
|| String::new(),
|v| match v {
ResolvedValue::String(s) => s.to_string(),
_ => String::new(),
},
)
};
($ctx:ident, $name:literal, Option<String>) => {
$ctx.args.iter().find(|opt| opt.name == $name).map(|opt| &opt.value).map(|v| match v {
ResolvedValue::String(s) => s.to_string(),
_ => String::new(),
})
};
($ctx:ident, $name:literal, bool) => {
$ctx.args.iter().find(|opt| opt.name == $name).map(|opt| &opt.value).map(|v| match v {
ResolvedValue::Boolean(b) => b.to_owned(),
_ => false,
})
};
($ctx:ident, $name:literal, Option<Tz>) => {
$ctx.args
.iter()
.find(|opt| opt.name == $name)
.map(|opt| &opt.value)
.map(|v| match v {
ResolvedValue::String(s) => s.parse::<Tz>().ok(),
_ => None,
})
.flatten()
};
}
impl RecordedCommand {
pub fn from_context(ctx: ApplicationContext) -> Option<Self> {
match ctx.command().identifying_name.as_str() {
"remind" => Some(Self::Remind(RemindOptions {
time: ctx
.args
.iter()
.find(|opt| opt.name == "time")
.map(|opt| &opt.value)
.map_or_else(
|| String::new(),
|v| match v {
ResolvedValue::String(s) => s.to_string(),
_ => String::new(),
},
),
content: ctx
.args
.iter()
.find(|opt| opt.name == "content")
.map(|opt| &opt.value)
.map_or_else(
|| String::new(),
|v| match v {
ResolvedValue::String(s) => s.to_string(),
_ => String::new(),
},
),
channels: None,
interval: None,
expires: None,
tts: None,
timezone: None,
time: extract_arg!(ctx, "time", String),
content: extract_arg!(ctx, "content", String),
channels: extract_arg!(ctx, "channels", Option<String>),
interval: extract_arg!(ctx, "interval", Option<String>),
expires: extract_arg!(ctx, "expires", Option<String>),
tts: extract_arg!(ctx, "tts", bool),
timezone: extract_arg!(ctx, "timezone", Option<Tz>),
})),
_ => None,
}
}
pub async fn execute(&self, ctx: ApplicationContext<'_>) -> Result<(), Error> {
pub async fn execute(self, ctx: ApplicationContext<'_>) -> Result<(), Error> {
match self {
RecordedCommand::Remind(command_options) => {
create_reminder(
Context::Application(ctx),
command_options.time.clone(),
command_options.content.clone(),
None,
None,
None,
None,
None,
command_options.time,
command_options.content,
command_options.channels,
command_options.interval,
command_options.expires,
command_options.tts,
command_options.timezone,
)
.await
}