parser_lua_module/
parser_lua_module.rs1mod 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}