wef 0.6.0

Wef is a Rust library for embedding WebView functionality using Chromium Embedded Framework (CEF3) with offscreen rendering support.
use std::ffi::CString;

use serde_json::Value;

use crate::{ffi::*, func_registry::CallFunctionError};

pub(crate) struct QueryCallback(*mut wef_query_callback_t);

unsafe impl Send for QueryCallback {}
unsafe impl Sync for QueryCallback {}

impl Drop for QueryCallback {
    fn drop(&mut self) {
        unsafe { wef_query_callback_destroy(self.0) };
    }
}

impl QueryCallback {
    pub(crate) fn new(callback: *mut wef_query_callback_t) -> Self {
        Self(callback)
    }

    pub(crate) fn result(self, res: Result<Value, CallFunctionError>) {
        match res {
            Ok(resp) => self.success(resp),
            Err(err) => self.failure(err),
        }
    }

    fn success(self, resp: Value) {
        let resp = CString::new(serde_json::to_string(&resp).unwrap_or_default()).unwrap();
        unsafe { wef_query_callback_success(self.0, resp.as_ptr()) }
    }

    fn failure(self, err: CallFunctionError) {
        let err = CString::new(err.to_string()).unwrap();
        unsafe { wef_query_callback_failure(self.0, err.as_ptr()) }
    }
}