use super::*;
use std::ptr::null_mut;
#[no_mangle]
pub extern "C" fn dqcs_arb_new() -> dqcs_handle_t {
insert(ArbData::default())
}
#[no_mangle]
pub extern "C" fn dqcs_arb_json_set(arb: dqcs_handle_t, json: *const c_char) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
arb.set_json(receive_str(json)?)?;
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_json_get(arb: dqcs_handle_t) -> *mut c_char {
api_return_string(|| {
resolve!(arb as &ArbData);
arb.get_json()
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_cbor_set(
arb: dqcs_handle_t,
obj: *const c_void,
obj_size: size_t,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
arb.set_cbor(receive_raw(obj, obj_size)?)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_cbor_get(
arb: dqcs_handle_t,
obj: *mut c_void,
obj_size: size_t,
) -> ssize_t {
api_return(-1, || {
resolve!(arb as &ArbData);
return_raw(&arb.get_cbor(), obj, obj_size)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_push_str(arb: dqcs_handle_t, s: *const c_char) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
arb.get_args_mut().push(receive_str(s)?.bytes().collect());
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_push_raw(
arb: dqcs_handle_t,
obj: *const c_void,
obj_size: size_t,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
arb.get_args_mut()
.push(receive_raw(obj, obj_size)?.to_owned());
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_pop_str(arb: dqcs_handle_t) -> *mut c_char {
api_return_string(|| {
resolve!(arb as &mut ArbData);
Ok(String::from_utf8(
arb.get_args_mut()
.pop()
.ok_or_else(oe_inv_arg("pop from empty list"))?,
)?)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_pop_raw(
arb: dqcs_handle_t,
obj: *mut c_void,
obj_size: size_t,
) -> ssize_t {
api_return(-1, || {
resolve!(arb as &mut ArbData);
return_raw(
&arb.get_args_mut()
.pop()
.ok_or_else(oe_inv_arg("pop from empty list"))?,
obj,
obj_size,
)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_pop(arb: dqcs_handle_t) -> dqcs_return_t {
if dqcs_arb_pop_raw(arb, null_mut(), 0) < 0 {
dqcs_return_t::DQCS_FAILURE
} else {
dqcs_return_t::DQCS_SUCCESS
}
}
#[no_mangle]
pub extern "C" fn dqcs_arb_insert_str(
arb: dqcs_handle_t,
index: ssize_t,
s: *const c_char,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
let len = arb.get_args().len();
arb.get_args_mut().insert(
receive_index(len, index, true)?,
receive_str(s)?.bytes().collect(),
);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_insert_raw(
arb: dqcs_handle_t,
index: ssize_t,
obj: *const c_void,
obj_size: size_t,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
let len = arb.get_args().len();
arb.get_args_mut().insert(
receive_index(len, index, true)?,
receive_raw(obj, obj_size)?.to_owned(),
);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_remove(arb: dqcs_handle_t, index: ssize_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
let len = arb.get_args().len();
arb.get_args_mut().remove(receive_index(len, index, false)?);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_set_str(
arb: dqcs_handle_t,
index: ssize_t,
s: *const c_char,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
let mut s: Vec<u8> = receive_str(s)?.bytes().collect();
let index = receive_index(arb.get_args().len(), index, false)?;
let arg = &mut arb.get_args_mut()[index];
arg.clear();
arg.append(&mut s);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_set_raw(
arb: dqcs_handle_t,
index: ssize_t,
obj: *const c_void,
obj_size: size_t,
) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
let mut s: Vec<u8> = receive_raw(obj, obj_size)?.to_owned();
let index = receive_index(arb.get_args().len(), index, false)?;
let arg = &mut arb.get_args_mut()[index];
arg.clear();
arg.append(&mut s);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_get_str(arb: dqcs_handle_t, index: ssize_t) -> *mut c_char {
api_return_string(|| {
resolve!(arb as &ArbData);
Ok(String::from_utf8(
arb.get_args()[receive_index(arb.get_args().len(), index, false)?].clone(),
)?)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_get_raw(
arb: dqcs_handle_t,
index: ssize_t,
obj: *mut c_void,
obj_size: size_t,
) -> ssize_t {
api_return(-1, || {
resolve!(arb as &ArbData);
return_raw(
&arb.get_args()[receive_index(arb.get_args().len(), index, false)?],
obj,
obj_size,
)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_get_size(arb: dqcs_handle_t, index: ssize_t) -> ssize_t {
dqcs_arb_get_raw(arb, index, null_mut(), 0)
}
#[no_mangle]
pub extern "C" fn dqcs_arb_len(arb: dqcs_handle_t) -> ssize_t {
api_return(-1, || {
resolve!(arb as &ArbData);
Ok(arb.get_args().len() as ssize_t)
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_clear(arb: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(arb as &mut ArbData);
arb.get_args_mut().clear();
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_arb_assign(dest: dqcs_handle_t, src: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(src as &ArbData);
resolve!(dest as &mut ArbData);
dest.set_cbor_unchecked(src.get_cbor());
dest.set_args(src.get_args());
Ok(())
})
}