minor refactoring
This commit is contained in:
parent
df0c17bf0a
commit
84af157122
4
betterproto-extras/Cargo.lock
generated
4
betterproto-extras/Cargo.lock
generated
@ -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",
|
||||||
|
@ -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"
|
||||||
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user