facet-dom

Crates.iofacet-dom
lib.rsfacet-dom
version0.43.1
created_at2026-01-22 16:54:03.689305+00
updated_at2026-01-23 08:49:42.322258+00
descriptionTree-based (DOM) deserializer for facet - supports HTML and XML
homepagehttps://facet.rs
repositoryhttps://github.com/facet-rs/facet
max_upload_size
id2062163
size207,945
Amos Wenger (fasterthanlime)

documentation

README

facet-dom

Coverage Status crates.io documentation MIT/Apache-2.0 licensed Discord

Tree-based (DOM) serialization and deserialization for facet.

Overview

This crate provides the core serializers and deserializers for tree-structured documents like HTML and XML. It handles the DOM-specific concerns that don't apply to flat formats like JSON:

  • Tag names: Elements have names (<div>, <person>)
  • Attributes: Key-value pairs on elements (id="main", class="active")
  • Mixed content: Text and child elements can be interleaved

Architecture

facet-dom sits between the format-specific parsers (facet-html, facet-xml) and the generic facet reflection system:

facet-html / facet-xml
         ↓
     facet-dom  (DOM events: StartElement, Attribute, Text, EndElement)
         ↓
   facet-reflect (Peek/Poke)
         ↓
    Your Rust types

Key Types

DomDeserializer

Consumes DOM events and builds Rust values:

use facet_dom::{DomDeserializer, DomParser};

// Parser emits events, deserializer consumes them
let parser: impl DomParser = /* ... */;
let value: MyType = DomDeserializer::new(parser).deserialize()?;

DomSerializer

Converts Rust values to DOM events for output.

Field Mappings

The deserializer maps DOM concepts to Rust types using facet attributes:

DOM Concept Rust Representation Attribute
Tag name Struct variant #[facet(rename = "tag")]
Attribute Field #[facet(html::attribute)]
Text content String field #[facet(html::text)]
Child elements Vec field #[facet(html::elements)]

Naming Conventions

Handles automatic case conversion between DOM naming (kebab-case) and Rust naming (snake_case), plus singularization for collection fields.

Sponsors

Thanks to all individual sponsors:

GitHub Sponsors Patreon

...along with corporate sponsors:

AWS Zed Depot

...without whom this work could not exist.

Special thanks

The facet logo was drawn by Misiasart.

License

Licensed under either of:

at your option.

Commit count: 3380

cargo fmt