1#![allow(clippy::cargo_common_metadata)]
2
3use bstr::BString;
4use mlua::prelude::*;
5
6use lune_utils::TableBuilder;
7
8mod compress_decompress;
9mod encode_decode;
10mod hash;
11
12pub use self::compress_decompress::{CompressDecompressFormat, compress, decompress};
13pub use self::encode_decode::{EncodeDecodeConfig, EncodeDecodeFormat, decode, encode};
14pub use self::hash::HashOptions;
15
16const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau"));
17
18#[must_use]
22pub fn typedefs() -> String {
23 TYPEDEFS.to_string()
24}
25
26pub fn module(lua: Lua) -> LuaResult<LuaTable> {
34 TableBuilder::new(lua)?
35 .with_function("encode", serde_encode)?
36 .with_function("decode", serde_decode)?
37 .with_async_function("compress", serde_compress)?
38 .with_async_function("decompress", serde_decompress)?
39 .with_function("hash", hash_message)?
40 .with_function("hmac", hmac_message)?
41 .build_readonly()
42}
43
44fn serde_encode(
45 lua: &Lua,
46 (format, value, pretty): (EncodeDecodeFormat, LuaValue, Option<bool>),
47) -> LuaResult<LuaString> {
48 let config = EncodeDecodeConfig::from((format, pretty.unwrap_or_default()));
49 encode(value, lua, config)
50}
51
52fn serde_decode(lua: &Lua, (format, bs): (EncodeDecodeFormat, BString)) -> LuaResult<LuaValue> {
53 let config = EncodeDecodeConfig::from(format);
54 decode(bs, lua, config)
55}
56
57async fn serde_compress(
58 lua: Lua,
59 (format, bs, level): (CompressDecompressFormat, BString, Option<i32>),
60) -> LuaResult<LuaString> {
61 let bytes = compress(bs, format, level).await?;
62 lua.create_string(bytes)
63}
64
65async fn serde_decompress(
66 lua: Lua,
67 (format, bs): (CompressDecompressFormat, BString),
68) -> LuaResult<LuaString> {
69 let bytes = decompress(bs, format).await?;
70 lua.create_string(bytes)
71}
72
73fn hash_message(lua: &Lua, options: HashOptions) -> LuaResult<LuaString> {
74 lua.create_string(options.hash())
75}
76
77fn hmac_message(lua: &Lua, options: HashOptions) -> LuaResult<LuaString> {
78 lua.create_string(options.hmac()?)
79}