Derive Macro zvariant_derive::Value

source ·
#[derive(Value)]
Expand description

Implements conversions for your type to/from Value.

Implements TryFrom<Value> and Into<Value> for your type.

§Examples

Simple owned strutures:

use zvariant::{OwnedObjectPath, OwnedValue, Value};

#[derive(Clone, Value, OwnedValue)]
struct OwnedStruct {
    owned_str: String,
    owned_path: OwnedObjectPath,
}

let s = OwnedStruct {
    owned_str: String::from("hi"),
    owned_path: OwnedObjectPath::try_from("/blah").unwrap(),
};
let value = Value::from(s.clone());
let _ = OwnedStruct::try_from(value).unwrap();
let value = OwnedValue::try_from(s).unwrap();
let s = OwnedStruct::try_from(value).unwrap();
assert_eq!(s.owned_str, "hi");
assert_eq!(s.owned_path.as_str(), "/blah");

Now for the more exciting case of unowned structures:

use zvariant::{ObjectPath, Str};
#[derive(Clone, Value, OwnedValue)]
struct UnownedStruct<'a> {
    s: Str<'a>,
    path: ObjectPath<'a>,
}

let hi = String::from("hi");
let s = UnownedStruct {
    s: Str::from(&hi),
    path: ObjectPath::try_from("/blah").unwrap(),
};
let value = Value::from(s.clone());
let s = UnownedStruct::try_from(value).unwrap();

let value = OwnedValue::try_from(s).unwrap();
let s = UnownedStruct::try_from(value).unwrap();
assert_eq!(s.s, "hi");
assert_eq!(s.path, "/blah");

Generic structures also supported:

#[derive(Clone, Value, OwnedValue)]
struct GenericStruct<S, O> {
    field1: S,
    field2: O,
}

let s = GenericStruct {
    field1: String::from("hi"),
    field2: OwnedObjectPath::try_from("/blah").unwrap(),
};
let value = Value::from(s.clone());
let _ = GenericStruct::<String, OwnedObjectPath>::try_from(value).unwrap();
let value = OwnedValue::try_from(s).unwrap();
let s = GenericStruct::<String, OwnedObjectPath>::try_from(value).unwrap();
assert_eq!(s.field1, "hi");
assert_eq!(s.field2.as_str(), "/blah");

Enums also supported but currently only simple ones w/ an integer representation:

#[derive(Debug, PartialEq, Value, OwnedValue)]
#[repr(u8)]
enum Enum {
    Variant1 = 1,
    Variant2 = 2,
}

let value = Value::from(Enum::Variant1);
let e = Enum::try_from(value).unwrap();
assert_eq!(e, Enum::Variant1);
let value = OwnedValue::try_from(Enum::Variant2).unwrap();
let e = Enum::try_from(value).unwrap();
assert_eq!(e, Enum::Variant2);

§Dictionary encoding

For treating your type as a dictionary, you can use the signature = "dict" attribute. See Type for more details and an example use. Please note that this macro can only handle dict or a{sv} values. All other values will be ignored.