minor refactoring

This commit is contained in:
Erik Friese 2023-08-30 15:39:34 +02:00
parent df0c17bf0a
commit 84af157122
4 changed files with 14 additions and 18 deletions

View File

@ -150,9 +150,9 @@ dependencies = [
[[package]] [[package]]
name = "prost-reflect" name = "prost-reflect"
version = "0.11.4" version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "000e1e05ebf7b26e1eba298e66fe4eee6eb19c567d0ffb35e0dd34231cdac4c8" checksum = "6b823de344848e011658ac981009100818b322421676740546f8b52ed5249428"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"prost", "prost",

View File

@ -8,6 +8,6 @@ name = "betterproto_extras"
crate-type = ["cdylib"] crate-type = ["cdylib"]
[dependencies] [dependencies]
prost-reflect = "0.11.4" prost-reflect = "0.11.5"
pyo3 = { version = "0.19.0", features = ["abi3-py37", "extension-module"] } pyo3 = { version = "0.19.0", features = ["abi3-py37", "extension-module"] }
thiserror = "1.0.47" thiserror = "1.0.47"

View File

@ -13,7 +13,7 @@ use pyo3::prelude::*;
fn deserialize(obj: &PyAny, buf: &[u8]) -> Result<()> { fn deserialize(obj: &PyAny, buf: &[u8]) -> Result<()> {
let desc = create_cached_descriptor(obj)?; let desc = create_cached_descriptor(obj)?;
let msg = DynamicMessage::decode(desc, buf)?; let msg = DynamicMessage::decode(desc, buf)?;
merge_msg_into_pyobj(obj, &msg)?; merge_msg_into_pyobj(obj, msg)?;
Ok(()) Ok(())
} }

View File

@ -2,26 +2,22 @@ use crate::{
error::{Error, Result}, error::{Error, Result},
py_any_extras::PyAnyExtras, py_any_extras::PyAnyExtras,
}; };
use prost_reflect::{DynamicMessage, ReflectMessage, Value}; use prost_reflect::{DynamicMessage, Value};
use pyo3::{PyAny, PyObject, ToPyObject}; use pyo3::{PyAny, PyObject, ToPyObject};
pub fn merge_msg_into_pyobj(obj: &PyAny, msg: &DynamicMessage) -> Result<()> { pub fn merge_msg_into_pyobj(obj: &PyAny, mut msg: DynamicMessage) -> Result<()> {
for field in msg.descriptor().fields() { for field in msg.take_fields() {
let field_name = field.name(); let field_name = field.0.name();
let proto_meta = obj.get_proto_meta()?; let proto_meta = obj.get_proto_meta()?;
if msg.has_field_by_name(field_name) {
if let Some(field_value) = msg.get_field_by_name(field_name) {
obj.setattr( obj.setattr(
field_name, field_name,
map_field_value(field_name, &field_value, proto_meta)?, map_field_value(field_name, field.1, proto_meta)?,
)?; )?;
} }
}
}
Ok(()) Ok(())
} }
fn map_field_value(field_name: &str, field_value: &Value, proto_meta: &PyAny) -> Result<PyObject> { fn map_field_value(field_name: &str, field_value: Value, proto_meta: &PyAny) -> Result<PyObject> {
let py = proto_meta.py(); let py = proto_meta.py();
match field_value { match field_value {
Value::Bool(x) => Ok(x.to_object(py)), Value::Bool(x) => Ok(x.to_object(py)),
@ -39,7 +35,7 @@ fn map_field_value(field_name: &str, field_value: &Value, proto_meta: &PyAny) ->
Ok(obj.to_object(py)) Ok(obj.to_object(py))
} }
Value::List(ls) => Ok(ls Value::List(ls) => Ok(ls
.iter() .into_iter()
.map(|x| map_field_value(field_name, x, proto_meta)) .map(|x| map_field_value(field_name, x, proto_meta))
.collect::<Result<Vec<PyObject>>>()? .collect::<Result<Vec<PyObject>>>()?
.to_object(py)), .to_object(py)),