autosway 0.5.0

Automation program
Documentation
use std::sync::Arc;

use super::*;
use notify_rust::{Hint, Notification, Urgency};

use arboard::{self, ClearExtLinux, GetExtLinux, SetExtLinux};

pub struct Desktop;
impl Module for Desktop {
    fn load(&self, state: &mut State) -> Result<(), LuaError> {
        let module = state.lua.create_table()?;

        module.set(
            "notify",
            state.lua.create_function(
                |_,
                 (summary, body, icon, urgent): (
                    String,
                    Option<String>,
                    Option<String>,
                    Option<bool>,
                )| {
                    let mut n = Notification::new();

                    n.summary(&summary);
                    n.body(&body.unwrap_or(String::new()));
                    n.appname("autosway");

                    if let Some(true) = urgent {
                        n.hint(Hint::Urgency(Urgency::Critical));
                    }

                    if let Some(icon) = icon {
                        n.icon(&icon);
                    }

                    match n.show() {
                        Ok(_handle) => {}
                        Err(e) => return Err(LuaError::external(Arc::new(e))),
                    }

                    Ok(())
                },
            )?,
        )?;

        module.set(
            "get_clipboard",
            state.lua.create_function(|_, _: ()| Clipboard::new())?,
        )?;

        create_module(&state.lua, "autosway.desktop", module)?;

        Ok(())
    }
}

pub struct Clipboard(arboard::Clipboard);

impl Clipboard {
    pub fn new() -> LuaResult<Self> {
        match arboard::Clipboard::new() {
            Ok(c) => Ok(Self(c)),
            Err(e) => Err(LuaError::external(Arc::new(e))),
        }
    }
}

impl LuaUserData for Clipboard {
    fn add_methods<M: LuaUserDataMethods<Self>>(methods: &mut M) {
        use arboard::LinuxClipboardKind;
        const CT: LinuxClipboardKind = LinuxClipboardKind::Clipboard;

        methods.add_method_mut("clear", |_, this, _: ()| {
            match this.0.clear_with().clipboard(CT) {
                Ok(_) => Ok(()),
                Err(e) => Err(LuaError::external(Arc::new(e))),
            }
        });

        methods.add_method_mut("get_text", |_, this, _: ()| {
            match this.0.get().clipboard(CT).text() {
                Ok(text) => Ok(text),
                Err(e) => Err(LuaError::external(Arc::new(e))),
            }
        });

        methods.add_method_mut("set_text", |_, this, text: String| {
            match this.0.set().clipboard(CT).text(text) {
                Ok(_) => Ok(()),
                Err(e) => Err(LuaError::external(Arc::new(e))),
            }
        });

        methods.add_method_mut(
            "set_html",
            |_, this, (html, alt): (String, Option<String>)| match this
                .0
                .set()
                .clipboard(CT)
                .html(html, alt)
            {
                Ok(_) => Ok(()),
                Err(e) => Err(LuaError::external(Arc::new(e))),
            },
        );
    }
}