use crate::module_exports::{ModuleExports, ModuleParam};
use crate::typed_module_exports::{
ConcreteReturn, ConcreteType, TypedReturn, register_typed_function,
};
use shape_value::KindedSlot;
use std::sync::Arc;
fn slot_as_string(slot: &KindedSlot) -> Option<Arc<String>> {
let bits = slot.slot().raw();
if bits == 0 {
return None;
}
unsafe {
let arc = Arc::<String>::from_raw(bits as *const String);
let cloned = arc.clone();
std::mem::forget(arc);
Some(cloned)
}
}
pub fn create_toml_module() -> ModuleExports {
let mut module = ModuleExports::new("std::core::toml");
module.description = "TOML parsing and serialization".to_string();
register_typed_function(
&mut module,
"parse",
"Parse a TOML string into Shape values",
vec![ModuleParam {
name: "text".to_string(),
type_name: "string".to_string(),
required: true,
description: "TOML string to parse".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::HashMap)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"toml.parse() pending N6 (any-output marshal) — see ADR-006 §2.7.4".to_string(),
)))
},
);
register_typed_function(
&mut module,
"stringify",
"Serialize Shape values to a TOML string",
vec![ModuleParam {
name: "value".to_string(),
type_name: "any".to_string(),
required: true,
description: "Value to serialize (must be a HashMap or TypedObject)".to_string(),
..Default::default()
}],
ConcreteType::Result(Box::new(ConcreteType::String)),
|_args, _ctx| {
Ok(TypedReturn::Err(ConcreteReturn::String(
"toml.stringify() pending N4 (any-input marshal) — see ADR-006 §2.7.4"
.to_string(),
)))
},
);
register_typed_function(
&mut module,
"is_valid",
"Check if a string is valid TOML",
vec![ModuleParam {
name: "text".to_string(),
type_name: "string".to_string(),
required: true,
description: "String to validate as TOML".to_string(),
..Default::default()
}],
ConcreteType::Bool,
|args, _ctx| {
let slot = args
.first()
.ok_or_else(|| "toml.is_valid() requires a string argument".to_string())?;
let text = slot_as_string(slot)
.ok_or_else(|| "toml.is_valid() requires a string argument".to_string())?;
let valid = toml::from_str::<toml::Value>(text.as_str()).is_ok();
Ok(TypedReturn::Concrete(ConcreteReturn::Bool(valid)))
},
);
module
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_toml_module_creation() {
let module = create_toml_module();
assert_eq!(module.name, "std::core::toml");
assert!(module.has_export("parse"));
assert!(module.has_export("stringify"));
assert!(module.has_export("is_valid"));
}
#[test]
fn test_toml_typed_registry_populated() {
let module = create_toml_module();
let typed = module.typed_exports();
assert!(typed.get("parse").is_some());
assert!(typed.get("stringify").is_some());
assert!(typed.get("is_valid").is_some());
}
}