mlua-socket 0.2.7

A Rust-native implementation of LuaSocket for mlua.
use base64::{Engine as _, engine::general_purpose};
use mlua::{Error, Lua};

pub(super) fn handle(_lua: &Lua, encoded: mlua::String) -> Result<String, Error> {
    let encoded_as_str = encoded.to_str().map_err(|err| Error::RuntimeError(err.to_string()))?;
    let decoded: Vec<u8> = general_purpose::STANDARD
        .decode(encoded_as_str.as_bytes())
        .map_err(|err| Error::RuntimeError(err.to_string()))?;
    let decoded_as_str = std::str::from_utf8(decoded.as_slice()).map_err(|err| Error::RuntimeError(err.to_string()))?;
    Ok(decoded_as_str.to_string())
}

#[cfg(test)]
mod tests {
    use mlua::Lua;
    use std::error::Error;

    #[test]
    fn unb64() -> Result<(), Box<dyn Error>> {
        let lua = Lua::new();
        crate::preload(&lua)?;
        let encoded: String = lua
            .load(
                r#"
                local mime = require('mime')
                return mime.unb64('YWJjZA==')
            "#,
            )
            .eval()?;
        assert_eq!(encoded, "abcd");
        Ok(())
    }
}