use crate::module_exports::{ModuleExports, ModuleParam};
use crate::typed_module_exports::{
ConcreteReturn, ConcreteType, TypedReturn, register_typed_function,
};
pub fn create_msgpack_module() -> ModuleExports {
let mut module = ModuleExports::new("std::core::msgpack");
module.description = "MessagePack binary serialization".to_string();
register_typed_function(
&mut module,
"encode",
"Encode a value to MessagePack (hex-encoded string)",
vec![ModuleParam {
name: "value".to_string(),
type_name: "any".to_string(),
required: true,
description: "Value to encode".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::String)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"msgpack.encode() pending N4 (any-input marshal) — see ADR-006 §2.7.4".to_string(),
)))
},
);
register_typed_function(
&mut module,
"decode",
"Decode a hex-encoded MessagePack string to a value",
vec![ModuleParam {
name: "data".to_string(),
type_name: "string".to_string(),
required: true,
description: "Hex-encoded MessagePack data".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::Any)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"msgpack.decode() pending N6 (any-output marshal) — see ADR-006 §2.7.4".to_string(),
)))
},
);
register_typed_function(
&mut module,
"encode_bytes",
"Encode a value to MessagePack as a byte array",
vec![ModuleParam {
name: "value".to_string(),
type_name: "any".to_string(),
required: true,
description: "Value to encode".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::ArrayInt)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"msgpack.encode_bytes() pending N4 (any-input marshal) — see ADR-006 §2.7.4"
.to_string(),
)))
},
);
register_typed_function(
&mut module,
"decode_bytes",
"Decode MessagePack from a byte array to a value",
vec![ModuleParam {
name: "data".to_string(),
type_name: "Array<int>".to_string(),
required: true,
description: "Array of byte values (0-255)".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::Any)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"msgpack.decode_bytes() pending N6 (any-output marshal) — see ADR-006 §2.7.4"
.to_string(),
)))
},
);
module
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_msgpack_module_creation() {
let module = create_msgpack_module();
assert_eq!(module.name, "std::core::msgpack");
assert!(module.has_export("encode"));
assert!(module.has_export("decode"));
assert!(module.has_export("encode_bytes"));
assert!(module.has_export("decode_bytes"));
}
#[test]
fn test_msgpack_typed_registry_populated() {
let module = create_msgpack_module();
let typed = module.typed_exports();
assert!(typed.get("encode").is_some());
assert!(typed.get("decode").is_some());
assert!(typed.get("encode_bytes").is_some());
assert!(typed.get("decode_bytes").is_some());
}
}