Property attributes

This section calls out a few attributes you can use to change the way properties are captured. See the crate docs for a complete list of attributes defined by emit.

#[cfg]

You can add the standard #[cfg] attribute to properties in templates. If the #[cfg] evaluates to false then the entire hole will be omitted from the template.

#![allow(unused)]
fn main() {
extern crate emit;
emit::emit!("Hello, {#[cfg(disabled)] user}");
}
Event {
    mdl: "my_app",
    tpl: "Hello, ",
    extent: Some(
        "2024-10-02T22:01:01.431485400Z",
    ),
    props: {},
}

#[key]

The #[key attribute can be used to set the name of a captured property. This can be used to give a property a name that isn't a valid Rust identifier:

#![allow(unused)]
fn main() {
extern crate emit;
let user = "Rust";
emit::emit!("Hello, {user}", #[emit::key("user.name")] user);
}
Event {
    mdl: "my_app",
    tpl: "Hello, {user.name}",
    extent: Some(
        "2024-10-02T22:01:24.321035400Z",
    ),
    props: {
        "user.name": "Rust",
    },
}

#[fmt]

The #[fmt] attribute applies a formatter to a property value when rendering it in the template. The accepted syntax is the same as Rust's std::fmt:

#![allow(unused)]
fn main() {
extern crate emit;
emit::emit!("pi is {pi}", #[emit::fmt(".3")] pi: 3.1415927);
}
Event {
    mdl: "my_app",
    tpl: "pi is {pi}",
    extent: Some(
        "2024-10-02T22:01:58.842629700Z",
    ),
    props: {
        "pi": 3.1415927,
    },
}

When rendered, the template will produce:

pi is 3.142

#[as_debug]

The #[as_debug] attribute captures a property value using its Debug implementation, instead of the default Display + 'static:

#![allow(unused)]
fn main() {
extern crate emit;
#[derive(Debug)]
struct User<'a> {
    name: &'a str,
}

emit::emit!(
    "Hello, {user}",
    #[emit::as_debug]
    user: User {
        name: "Rust",
    }
);
}
Event {
    mdl: "my_app",
    tpl: "Hello, {user}",
    extent: Some(
        "2024-10-02T22:03:23.588049400Z",
    ),
    props: {
        "user": User {
            name: "Rust",
        },
    },
}

Note that the structure of the captured value is lost. It'll be treated as a string like "User { name: \"Rust\" }" when serialized:

{
    "mdl": "my_app",
    "tpl": "Hello, {user}",
    "ts": "2024-10-02T22:03:23.588049400Z",
    "user": "User { name: \"Rust\" }"
}

See Property capturing for more details.

#[as_serde]

The #[as_serde] attribute captures a property value using its Serialize implementation, instead of the default Display + 'static:

#![allow(unused)]
fn main() {
extern crate emit;
#[macro_use] extern crate serde;
#[derive(Serialize)]
struct User<'a> {
    name: &'a str,
}

emit::emit!(
    "Hello, {user}",
    #[emit::as_serde]
    user: User {
        name: "Rust",
    }
);
}
Event {
    mdl: "my_app",
    tpl: "Hello, {user}",
    extent: Some(
        "2024-10-02T22:05:05.258099900Z",
    ),
    props: {
        "user": User {
            name: "Rust",
        },
    },
}

The structure of properties captured this way is fully preserved:

{
    "mdl": "my_app",
    "tpl": "Hello, {user}",
    "ts": "2024-10-02T22:05:05.258099900Z",
    "user": {
        "name": "Rust"
    }
}

See Property capturing for more details.