parser_lua_module/
parser_lua_module.rs

1mod formats;
2mod gamut;
3
4#[cfg(not(target_arch = "wasm32"))]
5mod lua {
6    use super::*;
7    use bevy_color::{Color, ColorToPacked, Srgba};
8    use clap::ValueEnum;
9    use formats::ColorFormat;
10    use mlua::prelude::*;
11
12    fn gamut_clip(color: Color) -> Color {
13        if let Color::Oklcha(color) = color {
14            gamut::gamut_clip_preserve_chroma(color.into()).into()
15        } else {
16            color
17        }
18    }
19
20    fn version(_: &Lua, _: ()) -> LuaResult<&'static str> {
21        Ok(env!("CARGO_PKG_VERSION"))
22    }
23
24    fn parse(_: &Lua, (color, fmt): (String, Option<String>)) -> LuaResult<Option<u32>> {
25        let color = if let Some(fmt) = fmt {
26            let parsed_fmt = ColorFormat::from_str(&fmt, true).map_err(LuaError::RuntimeError)?;
27            match formats::parse_color(&color, parsed_fmt) {
28                Some((c, _)) => c,
29                None => return Ok(None),
30            }
31        } else {
32            match formats::parse_color_unknown_format(&color) {
33                Some((c, _, _)) => c,
34                None => return Ok(None),
35            }
36        };
37
38        let color = gamut_clip(color);
39
40        let srgb = Srgba::from(color);
41        let [r, g, b] = srgb.to_u8_array_no_alpha();
42
43        Ok(Some(((r as u32) << 16) | ((g as u32) << 8) | b as u32))
44    }
45
46    #[mlua::lua_module(skip_memory_check)]
47    fn parser_lua_module(lua: &Lua) -> LuaResult<LuaTable> {
48        let exports = lua.create_table()?;
49        exports.set("parse", lua.create_function(parse)?)?;
50        exports.set("version", lua.create_function(version)?)?;
51        Ok(exports)
52    }
53}