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.