# cpeforge-ubl-validator
Valida documentos UBL 2.0 y 2.1 con libxml2 (XSD 1.0) contra un directorio
local con los 45 esquemas fijados en `schema-manifest.json`. El crate
comprueba el SHA-256 de cada esquema alcanzado y valida sobre una copia
privada de esos bytes, para evitar cambios entre la comprobación y la carga.
**Los XSD no se empaquetan** (contrato del crate): sus avisos OASIS, W3C, ETSI
y UN/CEFACT permiten copiarlos sin modificar, pero con condiciones distintas
por titular, así que el crate solo incluye el manifiesto (ruta, SHA-256,
titular y aviso de cada archivo) y se usan desde un directorio local. Para
obtenerlos, `scripts/prepare_ubl_validator_reference.sh` del repositorio clona
`thegreenter/ubl-validator` v2.3.0 en el commit fijado; los esquemas quedan en
`target/reference/ubl-validator-v2.3.0/src/xsd`. Cualquier otra copia sirve si
coincide con los SHA-256 del manifiesto.
```rust,no_run
use cpeforge_ubl_validator::UblValidator;
# fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut validator = UblValidator::new("/ruta/a/xsd")?;
let result = validator.validate(br#"<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"/>"#)?;
println!("{}", result.error);
# Ok(())
# }
```
Una entrada vacía devuelve `InfrastructureError::EmptyInput` (no una
validación fallida), igual que la referencia: es el contrato del crate.
Acepta las codificaciones XML que reconozca libxml2 salvo UTF-32 y EBCDIC,
sin DTD ni entidades declaradas; tamaño máximo 10 MiB, 100.000 nodos, 128
niveles y 256 atributos por elemento (`cpeforge_xml_limits::check_markup`).
Requiere libxml2 ≥ 2.9.11, comprobada al compilar y al iniciar. Rechaza
esquemas modificados y referencias fuera del conjunto fijado. En macOS usa
libxml2 del SDK; en Linux requiere `libxml2-dev` y `pkg-config`. Sin soporte
Windows todavía. MSRV: Rust 1.85.
## Estado
Versión 0.2.0 en desarrollo. Lo que falta para la primera versión estable está en
[docs/pendientes.md](https://github.com/alvarez25leo/cpeforge/blob/main/docs/pendientes.md).
## Licencia
MIT. Ver `LICENSE` y, para el material de terceros incluido, `LICENSE-THIRD-PARTY` y `NOTICE`.