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