zvariant

Derive Macro SerializeDict

Source
#[derive(SerializeDict)]
{
    // Attributes available to this derive:
    #[zbus]
    #[zvariant]
}
Expand description

Adds Serialize implementation to structs to be serialized as a{sv} type.

This macro serializes the deriving struct as a D-Bus dictionary type, where keys are strings and values are generic values. Such dictionary types are very commonly used with D-Bus and GVariant.

§Examples

For structs it works just like serde’s Serialize macros:

use zvariant::{SerializeDict, Type};

#[derive(SerializeDict, Type)]
#[zvariant(signature = "a{sv}")]
struct Struct {
    field1: u16,
    #[zvariant(rename = "another-name")]
    field2: i64,
    optional_field: Option<String>,
}

The serialized D-Bus version of Struct {42, 77, None} will be {"field1": Value::U16(42), "another-name": Value::I64(77)}.

§Auto renaming fields

The macro supports specifying a Serde-like #[zvariant(rename_all = "case")] attribute on structures. The attribute allows to rename all the fields from snake case to another case automatically:

use zvariant::{SerializeDict, Type};

#[derive(SerializeDict, Type)]
#[zvariant(signature = "a{sv}", rename_all = "PascalCase")]
struct Struct {
    field1: u16,
    #[zvariant(rename = "another-name")]
    field2: i64,
    optional_field: Option<String>,
}

It’s still possible to specify custom names for individual fields using the #[zvariant(rename = "another-name")] attribute even when the rename_all attribute is present.

Currently the macro supports the following values for case:

  • "lowercase"
  • "UPPERCASE"
  • "PascalCase"
  • "camelCase"
  • "snake_case"
  • "kebab-case"