Re: [PATCH 11/19] rust/qobject: add from/to JSON bindings for QObject

Markus Armbruster <[email protected]>
Newsgroups org.nongnu.qemu-rust,org.nongnu.qemu-devel
Message-ID <[email protected]>
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 {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.