Paolo Bonzini <[email protected]> writes: > These are used by tests. However it could even be an idea to use > serde_json + transcoding and get rid of the C version...
Tell me more! > Co-authored-by: Marc-André Lureau <[email protected]> > Signed-off-by: Marc-André Lureau <[email protected]> > Signed-off-by: Paolo Bonzini <[email protected]> > --- > rust/util/wrapper.h | 1 + > rust/util/src/qobject/mod.rs | 17 +++++++++++++++++ > 2 files changed, 18 insertions(+) > > diff --git a/rust/util/wrapper.h b/rust/util/wrapper.h > index 0907dd59142..c88820a5e5b 100644 > --- a/rust/util/wrapper.h > +++ b/rust/util/wrapper.h > @@ -37,3 +37,4 @@ typedef enum memory_order { > #include "qobject/qobject.h" > #include "qobject/qlist.h" > #include "qobject/qdict.h" > +#include "qobject/qjson.h" > diff --git a/rust/util/src/qobject/mod.rs b/rust/util/src/qobject/mod.rs > index e896aba5f3a..292a3c9c238 100644 > --- a/rust/util/src/qobject/mod.rs > +++ b/rust/util/src/qobject/mod.rs > @@ -23,6 +23,7 @@ > use common::assert_field_type; > pub use deserializer::from_qobject; > pub use error::{Error, Result}; > +use foreign::prelude::*; > pub use serializer::to_qobject; > > use crate::bindings; > @@ -111,6 +112,22 @@ fn refcnt(&self) -> &AtomicUsize { > let qobj = self.0.get(); > unsafe { AtomicUsize::from_ptr(addr_of_mut!((*qobj).base.refcnt)) } > } > + > + pub fn to_json(&self) -> String { > + let qobj = self.0.get(); > + unsafe { > + let json = bindings::qobject_to_json(qobj); > + glib_sys::g_string_free(json, glib_sys::GFALSE).into_native() > + } > + } > + > + pub fn from_json(json: &str) -> std::result::Result<Self, crate::Error> { > + let c_json = std::ffi::CString::new(json)?; > + unsafe { > + crate::Error::with_errp(|errp| > bindings::qobject_from_json(c_json.as_ptr(), errp)) > + .map(|qobj| QObject::from_raw(qobj)) > + } > + } > } > > impl From<()> for QObject {
