dbus2 / zbus

Rust D-Bus crate.
Other
394 stars 90 forks source link

Value/OwnedValue macro doesn't support renaming fields #320

Open zeenix opened 1 year ago

zeenix commented 1 year ago

In GitLab by @wynprice999 on Mar 1, 2023, 22:01

It seems like the field names used for deserialization can't be renamed. I would expect using #[zvariant(rename = "...")] would rename the field, but it doesn't appear to have an effect:

Example expansion ```rust #[derive(DeserializeDict, Value, OwnedValue)] #[zvariant(signature = "dict")] pub struct TrackMetadata { #[zvariant(rename = "otherfield")] pub field1: String, pub field2: String } ``` Expands to the following: ```rs #[zvariant(signature = "dict")] pub struct TrackMetadata { #[zvariant(rename = "otherfield")] pub field1: String, pub field2: String, } ... impl ::std::convert::TryFrom<::zbus::zvariant::OwnedValue> for TrackMetadata { type Error = ::zbus::zvariant::Error; #[inline] fn try_from( value: ::zbus::zvariant::OwnedValue, ) -> ::zbus::zvariant::Result { let mut fields = <::std::collections::HashMap< ::std::string::String, ::zbus::zvariant::Value, >>::try_from(value)?; ::std::result::Result::Ok(Self { field1: fields .remove("field1") .ok_or_else(|| ::zbus::zvariant::Error::IncorrectType)? .downcast() .ok_or_else(|| ::zbus::zvariant::Error::IncorrectType)?, field2: fields .remove("field2") .ok_or_else(|| ::zbus::zvariant::Error::IncorrectType)? .downcast() .ok_or_else(|| ::zbus::zvariant::Error::IncorrectType)?, }) } } impl From for ::zbus::zvariant::OwnedValue { #[inline] fn from(s: TrackMetadata) -> Self { let mut fields = ::std::collections::HashMap::new(); fields.insert("field1", ::zbus::zvariant::Value::from(s.field1)); fields.insert("field2", ::zbus::zvariant::Value::from(s.field2)); ::zbus::zvariant::Value::from(fields).into() } } ```

From what I can tell, a solution would involve the following line: https://gitlab.freedesktop.org/dbus/zbus/-/blob/main/zvariant_derive/src/value.rs#L111

zeenix commented 1 year ago

@wynprice999 Thanks for reporting this. Yeah, renaming should work as you expect.

zeenix commented 1 year ago

@turbocooler Hey, this seems right up your alley. ;)

Detoxify92 commented 3 months ago

Hello, is there a workaround for this? I need to rename fields for a dictionary struct used as property, since they need to have a ':' character in the identifier, which is not very rust friendly. I suppose I could implement the conversion method needed, although I am a little bit lost in this regard. Thank you in advance!

zeenix commented 3 months ago

@Detoxify92 you can always use HashMap. *Dict macros are just for convenience.

Contributions are also welcome.