Skip to content

Commit 44acfa0

Browse files
server/prompter: Double wrapping fixes
1 parent 8ee8439 commit 44acfa0

1 file changed

Lines changed: 27 additions & 16 deletions

File tree

server/src/gnome/prompter.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,49 @@ use crate::{
2222
/// See: https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/169
2323
mod double_value_optional {
2424
use serde::ser::SerializeStruct;
25+
use zvariant::DynamicType;
2526

2627
use super::*;
2728

28-
struct DoubleValueSerialize<'a, T: Type + serde::Serialize>(pub &'a Option<T>);
29+
struct DoubleValueSerialize<'a, T: Type + serde::Serialize + DynamicType>(pub &'a Option<T>);
2930

30-
impl<T: Type + serde::Serialize> serde::Serialize for DoubleValueSerialize<'_, T> {
31+
impl<T: Type + serde::Serialize + DynamicType> serde::Serialize for DoubleValueSerialize<'_, T> {
3132
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
3233
where
3334
S: serde::Serializer,
3435
{
35-
struct InnerVariant<'a, U: Type + serde::Serialize>(&'a Option<U>);
36-
37-
impl<U: Type + serde::Serialize> serde::Serialize for InnerVariant<'_, U> {
38-
fn serialize<S2>(&self, serializer: S2) -> Result<S2::Ok, S2::Error>
39-
where
40-
S2: serde::Serializer,
41-
{
42-
as_value::optional::serialize(self.0, serializer)
36+
match self.0 {
37+
Some(v) => {
38+
struct InnerVariant<'a, U: Type + serde::Serialize + DynamicType>(&'a U);
39+
40+
impl<U: Type + serde::Serialize + DynamicType> serde::Serialize for InnerVariant<'_, U> {
41+
fn serialize<S2>(&self, serializer: S2) -> Result<S2::Ok, S2::Error>
42+
where
43+
S2: serde::Serializer,
44+
{
45+
// Serialize as a Variant containing the value
46+
let mut inner_structure = serializer.serialize_struct("Variant", 2)?;
47+
let sig = self.0.signature().to_string();
48+
inner_structure.serialize_field("signature", &sig)?;
49+
inner_structure.serialize_field("value", self.0)?;
50+
inner_structure.end()
51+
}
52+
}
53+
54+
let mut outer_structure = serializer.serialize_struct("Variant", 2)?;
55+
outer_structure.serialize_field("signature", "v")?;
56+
outer_structure.serialize_field("value", &InnerVariant(v))?;
57+
outer_structure.end()
4358
}
59+
None => serializer.serialize_none(),
4460
}
45-
46-
let mut outer_structure = serializer.serialize_struct("Variant", 2)?;
47-
outer_structure.serialize_field("signature", "v")?;
48-
outer_structure.serialize_field("value", &InnerVariant(self.0))?;
49-
outer_structure.end()
5061
}
5162
}
5263

5364
pub fn serialize<S, T>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
5465
where
5566
S: serde::Serializer,
56-
T: serde::Serialize + zvariant::Type,
67+
T: serde::Serialize + zvariant::Type + DynamicType,
5768
{
5869
DoubleValueSerialize(value).serialize(serializer)
5970
}

0 commit comments

Comments
 (0)