Diagnostics

Unknown Extension Attribute

Using an unknown attribute like kdl::nonexistent produces a clear error
that points directly to the attribute and suggests valid options.

Rust Input

use facet::Facet;
use facet_kdl as kdl;

#[derive(Facet)] struct Config { #[facet(kdl::nonexistent)] field: String, }

fn main() {}

Compiler Error

error: unknown attribute `nonexistent`
       available attributes: child, children, property, argument, arguments, node_name
 --> src/main.rs:6:18
  |
6 |     #[facet(kdl::nonexistent)]
  |                  ^^^^^^^^^^^

error: could not compile `test` (bin "test") due to 1 previous error

Typo in Attribute Name

Common typos like chld instead of child or proprty instead of property
are caught at compile time with helpful suggestions.

Rust Input

use facet::Facet;
use facet_kdl as kdl;

#[derive(Facet)] struct Config { #[facet(kdl::chld)] nested: Inner, }

#[derive(Facet)] struct Inner { #[facet(kdl::proprty)] value: String, }

fn main() {}

Compiler Error

error: unknown attribute `chld`, did you mean `child`?
       available attributes: child, children, property, argument, arguments, node_name
 --> src/main.rs:6:18
  |
6 |     #[facet(kdl::chld)]
  |                  ^^^^

error: unknown attribute `proprty`, did you mean `property`?        available attributes: child, children, property, argument, arguments, node_name   --> src/main.rs:12:18    | 12 |     #[facet(kdl::proprty)]    |                  ^^^^^^^

error: could not compile `test` (bin "test") due to 2 previous errors

Attribute with Unexpected Arguments

Passing arguments to attributes that don't accept them produces a clear error.

Rust Input

use facet::Facet;
use facet_kdl as kdl;

#[derive(Facet)] struct Config { #[facet(kdl::child = "unexpected")] nested: Inner, }

#[derive(Facet)] struct Inner { value: String, }

fn main() {}

Compiler Error

Valid Usage

When extension attributes are used correctly, everything compiles smoothly.
This shows the intended usage pattern for KDL attributes.

Rust Input

use facet::Facet;
use facet_kdl as kdl;

#[derive(Facet)] struct Config { #[facet(kdl::child)] server: Server,

<span style="color:#e0af68;">#</span><span style="color:#a9b1d6;">[</span><span style="color:#e0af68;">facet</span><span style="color:#a9b1d6;">(</span><span style="color:#e0af68;">kdl</span><span style="color:#a9b1d6;">::</span><span style="color:#e0af68;">property</span><span style="color:#a9b1d6;">)]</span>
<span style="color:#7aa2f7;">name</span><span style="color:#a9b1d6;">:</span> <span style="color:#2ac3de;">String</span><span style="color:#a9b1d6;">,</span>

<span style="color:#e0af68;">#</span><span style="color:#a9b1d6;">[</span><span style="color:#e0af68;">facet</span><span style="color:#a9b1d6;">(</span><span style="color:#e0af68;">kdl</span><span style="color:#a9b1d6;">::</span><span style="color:#e0af68;">argument</span><span style="color:#a9b1d6;">)]</span>
<span style="color:#7aa2f7;">version</span><span style="color:#a9b1d6;">:</span> <span style="color:#2ac3de;">u32</span><span style="color:#a9b1d6;">,</span>

}

#[derive(Facet)] struct Server { #[facet(kdl::property)] host: String,

<span style="color:#e0af68;">#</span><span style="color:#a9b1d6;">[</span><span style="color:#e0af68;">facet</span><span style="color:#a9b1d6;">(</span><span style="color:#e0af68;">kdl</span><span style="color:#a9b1d6;">::</span><span style="color:#e0af68;">property</span><span style="color:#a9b1d6;">)]</span>
<span style="color:#7aa2f7;">port</span><span style="color:#a9b1d6;">:</span> <span style="color:#2ac3de;">u16</span><span style="color:#a9b1d6;">,</span>

}

fn main() { println!("Compiles successfully!"); }

Compiler Error

Compilation successful! No errors.