map fields with values of message type were not serialized correctly
This commit is contained in:
Erik Friese 2023-09-05 21:38:51 +02:00
parent 0931eb3bf5
commit 8283ef7298
2 changed files with 60 additions and 33 deletions

View File

@ -100,6 +100,16 @@ fn add_message_to_file(
..Default::default()
};
proto.set_type(val);
if val == Type::Message {
set_type_name(
&message_name,
meta.get_class(&format!("{field_name}.value"))?,
&mut proto,
file,
&mut messages_to_add,
pool,
)?;
}
proto
},
],
@ -147,41 +157,20 @@ fn add_message_to_file(
}
Some(t) => return Err(Error::UnsupportedWrapperType(t)),
None => {
let cls = meta.get_class(field_name)?;
let cls_name = cls.qualified_name()?;
match cls_name.as_str() {
"datetime.datetime" => {
field.type_name =
Some("google.protobuf.Timestamp".to_string());
}
"datetime.timedelta" => {
field.type_name =
Some("google.protobuf.Duration".to_string());
}
_ => {
let cls_name = format!("{}_{}", cls_name, cls.py_identifier());
field.type_name = Some(cls_name.clone());
if message_name != cls_name
&& pool.get_message_by_name(&cls_name).is_none()
&& !file
.message_type
.iter()
.any(|item| item.name() == cls_name)
&& !messages_to_add
.iter()
.any(|item| item.0 == cls_name)
{
messages_to_add.push((cls_name, cls.call0()?));
}
}
}
set_type_name(
&message_name,
meta.get_class(field_name)?,
&mut field,
file,
&mut messages_to_add,
pool,
)?;
}
},
Type::Enum => {
let cls = meta.get_class(field_name)?;
let cls_name = format!("{}_{}", cls.qualified_name()?, cls.py_identifier());
let cls_name =
format!("{}_{}", cls.qualified_name()?, cls.py_identifier());
field.type_name = Some(cls_name.to_string());
if pool.get_enum_by_name(&cls_name).is_none()
@ -196,7 +185,11 @@ fn add_message_to_file(
let item = item?;
proto.value.push(EnumValueDescriptorProto {
number: Some(item.getattr("value")?.extract()?),
name: Some(format!("{}_{}", cls_name, item.getattr("name")?.extract::<&str>()?)),
name: Some(format!(
"{}_{}",
cls_name,
item.getattr("name")?.extract::<&str>()?
)),
..Default::default()
});
}
@ -260,3 +253,37 @@ fn map_type(str: &str) -> Result<Type> {
_ => Err(Error::UnsupportedType(str.to_string())),
}
}
fn set_type_name<'py>(
message_name: &str,
field_cls: &'py PyAny,
field: &mut FieldDescriptorProto,
file: &FileDescriptorProto,
messages_to_add: &mut Vec<(String, &'py PyAny)>,
pool: &DescriptorPool,
) -> Result<()> {
let cls_name = field_cls.qualified_name()?;
match cls_name.as_str() {
"datetime.datetime" => {
field.type_name = Some("google.protobuf.Timestamp".to_string());
}
"datetime.timedelta" => {
field.type_name = Some("google.protobuf.Duration".to_string());
}
_ => {
let cls_name = format!("{}_{}", cls_name, field_cls.py_identifier());
field.type_name = Some(cls_name.clone());
if message_name != cls_name
&& pool.get_message_by_name(&cls_name).is_none()
&& !file.message_type.iter().any(|item| item.name() == cls_name)
&& !messages_to_add.iter().any(|item| item.0 == cls_name)
{
messages_to_add.push((cls_name, field_cls.call0()?));
}
}
}
Ok(())
}

View File

@ -112,7 +112,7 @@ fn map_field_value(field_name: &str, field_value: Value, proto_meta: &PyAny) ->
.into_iter()
.map(|(k, v)| {
let key = map_key(k, py);
let val = map_field_value(field_name, v, proto_meta)?;
let val = map_field_value(&format!("{field_name}.value"), v, proto_meta)?;
Ok((key, val))
})
.collect();