@macroforge/mcp-server
Version:
MCP server for Macroforge documentation and code analysis
54 lines (43 loc) • 1.77 kB
Markdown
## Complete Example: JSON Derive Macro
Here's a comparison showing how `ts_template!` simplifies code generation:
### Before (Manual String Building)
Rust
```
pub fn derive_json_macro(mut input: TsStream) -> Result<TsStream, MacroforgeError> {
let input = parse_ts_macro_input!(input as DeriveInput);
let Some(class) = input.as_class() else {
return Err(MacroforgeError::new(input.error_span(), "@derive(JSON) needs a class"));
};
let mut body = String::from("const result = {};\\n");
for field_name in class.field_names() {
body.push_str(&format!("result.{field_name} = this.{field_name};\\n"));
}
body.push_str("return result;");
Ok(TsStream::from_string(format!(
"{}.prototype.toJSON = function() {{\\n{body}\\n}};",
input.name()
)))
}
```
### After (With ts\_template!)
Rust
```
pub fn derive_json_macro(mut input: TsStream) -> Result<TsStream, MacroforgeError> {
let input = parse_ts_macro_input!(input as DeriveInput);
let Some(class) = input.as_class() else {
return Err(MacroforgeError::new(input.error_span(), "@derive(JSON) needs a class"));
};
let class_name = input.name();
Ok(ts_template! {
@{class_name}.prototype.toJSON = function() {
const result = {};
{#for field in class.field_names()}
result.@{field} = this.@{field};
{/for}
return result;
};
})
}
```