autosway 0.4.1

Automation program
Documentation
use std::{io::BufReader, sync::Arc};

use super::*;
use rodio::{Decoder, OutputStream, Sink};

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

        module.set(
            "play_sound",
            state.lua.create_function(|_, path: String| {
                let (_stream, stream_handle) = match OutputStream::try_default() {
                    Ok(r) => r,
                    Err(e) => return Err(LuaError::external(Arc::new(e))),
                };
                let sink = match Sink::try_new(&stream_handle) {
                    Ok(r) => r,
                    Err(e) => return Err(LuaError::external(Arc::new(e))),
                };

                let f = BufReader::new(File::open(path)?);
                let source = match Decoder::new(f) {
                    Ok(r) => r,
                    Err(e) => return Err(LuaError::external(Arc::new(e))),
                };

                sink.append(source);
                sink.sleep_until_end();

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

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

        Ok(())
    }
}