# 008 - Macro XML
## Context
`src/macros/` ofrece la macro `xml!` como ergonomia declarativa. La macro no debe reemplazar al builder ni duplicar la logica central.
Excepcion tecnica aplicada: la sintaxis objetivo de `xml!` requiere parser de tokens, AST de template, generacion de codigo Rust y diagnosticos de compilacion. Se usara `crates/xdoc-macros` como unica crate procedural adicional. Esa excepcion solo cubre `xml!`; el resto del motor sigue en `xdoc`.
La experiencia objetivo se inspira en Leptos: tags XML, componentes, props, children e interpolacion con expresiones Rust.
Fuente: `plan_libreria_xml_generica_rust.md`, secciones "`xdoc-macro`", "Alcance del MVP de la macro", "Composicion antes que macro-magia" y "Fase 5 - Macro `xml!`".
Esta tarea queda como paraguas. La implementacion se divide en subtareas para que las decisiones, el scaffold de proc-macro, el parser, la generacion y las pruebas de compilacion sean revisables por separado.
## Dependencies
[x] 006 - Builder API.
[x] 017 - Leptos Style Component Model.
[x] 017f - Macro Readiness Notes.
## Instructions
[x] Ejecutar `008a - Macro Design Decisions`.
[x] Ejecutar `008b - Proc Macro Crate Scaffold`.
[x] Ejecutar `008c - Macro Output Bridge`.
[x] Ejecutar `008d - Macro Parser And AST`.
[x] Ejecutar `008e - Macro Basic Builder Codegen`.
[x] Ejecutar `008f - Macro Namespaces And Comments`.
[x] Ejecutar `008g - Macro Components Props Children`.
[x] Ejecutar `008h - Macro Compile Tests And Docs`.
## Checklist
[x] [008a - Macro Design Decisions](008a-macro-design-decisions.md) completada.
[x] [008b - Proc Macro Crate Scaffold](008b-proc-macro-crate-scaffold.md) completada.
[x] [008c - Macro Output Bridge](008c-macro-output-bridge.md) completada.
[x] [008d - Macro Parser And AST](008d-macro-parser-and-ast.md) completada.
[x] [008e - Macro Basic Builder Codegen](008e-macro-basic-builder-codegen.md) completada.
[x] [008f - Macro Namespaces And Comments](008f-macro-namespaces-and-comments.md) completada.
[x] [008g - Macro Components Props Children](008g-macro-components-props-children.md) completada.
[x] [008h - Macro Compile Tests And Docs](008h-macro-compile-tests-and-docs.md) completada.
[x] `xml! { <Root/> }` compila.
[x] `xml! { <Root><Child>text</Child></Root> }` compila.
[x] Interpolacion en texto compila.
[x] Interpolacion en atributo compila.
[x] Namespace default compila.
[x] Namespace con prefijo compila.
[x] Sintaxis de componente con prop compila.
[x] Sintaxis de componente con children compila.
[x] Errores de sintaxis tienen tests de compilacion o tests equivalentes documentados.
[x] Macro genera builder code, no construye nodos manualmente.
[x] `crates/` solo contiene `xdoc-macros`.
## Verification
Ejecutar:
```bash
cargo test macros
cargo test xml_macro
cargo test compile_pass
cargo test compile_fail
cargo fmt --all -- --check
cargo check
cargo test
Criterio medible:
[x] Hay minimo 5 tests de usos validos.
[x] Hay minimo 3 tests de usos invalidos o limitaciones documentadas.
[x] Un test confirma interoperabilidad con `src/writer/`.
[x] Un test confirma interpolacion de variables Rust.
[x] Un test confirma composicion con un componente Rust.
[x] `cargo test` valida `xdoc` y la proc-macro `xdoc-macros`.
## Acceptance Criteria
[x] La macro cubre el MVP sin intentar ser XML completo.
[x] Los errores son razonables para casos invalidos.
[x] Builder sigue siendo API primaria.
[x] `xdoc-macros` existe solo para implementar la proc-macro `xml!`.
[x] Ninguna otra crate adicional queda permitida.
[x] No se introduce dominio.
## Worklog
[x] Ajustada el 2026-06-11: la tarea arranca desde `xdoc-macros` como proc-macro justificada por el plan.
[x] Dividida el 2026-06-11 en subtareas `008a` a `008h`.
[x] Avance 2026-06-11: `008f` completada; `xml!` ya genera builder code para namespaces default/prefijados, elementos/atributos calificados y comentarios validos.
[x] Avance 2026-06-11: `008g` completada; `xml!` ya invoca componentes Rust con props tipadas, children y salida elemento/fragment.
[x] Completada el 2026-06-11 al cerrar `008h`; quedan tests compile-pass/compile-fail con `trybuild`, limites del MVP documentados y verificacion global pasando.