Add macro for extracting arguments
This commit is contained in:
parent
b81c3c80c1
commit
d0833b7bca
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user