Eu tenho as seguintes estruturas:
#[derive(Debug, Serialize)]
struct Container {
field0: Field<f64>,
field1: Field<f64>,
}
#[derive(Debug, Serialize)]
struct Field<T> {
val: T,
#[serde(skip_serializing_if = "Option::is_none")]
doc: Option<String>,
}
Para este caso:
Container {
field0: Field { val: 1.5, doc: Some("my documentation!") },
field1: Field { val: 2.0, doc: None }
}
Quero a seguinte saída YAML (já que doc
is None
):
field0:
val: 1.5
doc: my documentation!
field1: 2.0
Claro, a configuração derivada resulta nisto:
field0:
val: 1.5
doc: my documentation!
field1:
val: 2.0
onde val
é serializado em uma nova linha
Tentei implementar Serialize
sozinho Field
, mas não tinha certeza de como fazer com que o nome da chave desaparecesse e como colocar o valor na mesma linha do nome
impl<T> Serialize for Field<T> where T: Serialize {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
if self.doc.is_some() {
let mut state = serializer.serialize_struct("Field", 2)?;
state.serialize_field("val", &self.val)?;
state.serialize_field("doc", &self.doc)?;
state.end()
} else {
let mut state = serializer.serialize_struct("Field", 1)?;
state.serialize_field("", &self.val)?;
state.skip_field("doc")?;
state.end()
}
}
}
resultando na saída:
field0:
val: 1.5
doc: my documentation!
field1:
'': 2.0
Como devo proceder para implementá-lo? Existe uma maneira mais fácil/limpa?
Correção fácil. Se
doc
forNone
, então você não deseja serializar uma estrutura, apenas serializar o valor diretamente:Com o seu código de playground produz: