use rlua::prelude::*;use heck::*;pub struct LuaCase(String);impl LuaUserData for LuaCase {    fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) {        methods.add_method("to_camel", |_, this: &LuaCase, _:()| {            Ok(this.0.to_camel_case())        });        methods.add_method("to_kebab", |_, this: &LuaCase, _:()| {            Ok(this.0.to_kebab_case())        });        methods.add_method("to_mixed", |_, this: &LuaCase, _:()| {            Ok(this.0.to_mixed_case())        });        methods.add_method("to_shouty_snake", |_, this: &LuaCase, _:()| {            Ok(this.0.to_shouty_snake_case())        });        methods.add_method("to_snake", |_, this: &LuaCase, _:()| {            Ok(this.0.to_snake_case())        });        methods.add_method("to_title", |_, this: &LuaCase, _:()| {            Ok(this.0.to_title_case())        });    }}pub fn init(lua: &Lua) -> crate::Result<()> {    let module = lua.create_table()?;    module.set("new", lua.create_function(|_, text: String| {        Ok(LuaCase(text))    })?)?;    lua.globals().set("case", module)?;    Ok(())}#[cfg(test)]mod tests {    use super::*;    #[test]    fn lua_cambel () {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("We are not in the least afraid of ruins")            assert(val:to_camel() == "WeAreNotInTheLeastAfraidOfRuins")        "#, None).unwrap();    }    #[test]    fn lua_kebab () {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("We are going to inherit the earth")            assert(val:to_kebab() == "we-are-going-to-inherit-the-earth")        "#, None).unwrap();    }    #[test]    fn lua_mixed () {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("It is we who built these palaces and cities")            assert(val:to_mixed() == "itIsWeWhoBuiltThesePalacesAndCities")        "#, None).unwrap();    }    #[test]    fn lua_shouty() {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("That world is growing in this minute")            assert(val:to_shouty_snake() == "THAT_WORLD_IS_GROWING_IN_THIS_MINUTE")        "#, None).unwrap();    }    #[test]    fn lua_snake () {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("We carry a new world here, in our hearts")            assert(val:to_snake() == "we_carry_a_new_world_here_in_our_hearts")        "#, None).unwrap();    }    #[test]    fn lua_title () {        let lua = Lua::new();        init(&lua).unwrap();        lua.exec::<_, ()>(r#"            local val = case.new("We have always lived in slums and holes in the wall")            assert(val:to_title() == "We Have Always Lived In Slums And Holes In The Wall")        "#, None).unwrap();    }}