use std::collections::HashMap;
use serde::Serialize;
use crate::util::go_map::GoMap;
use crate::util::go_type::FFIError;
use crate::util::go_type::NosqldbGetRequestPtr;
use crate::util::util::ref_free_drop;
use self::ffi::nosqldb_get_request_new;
use self::ffi::nosqldb_get_request_table_name_set;
use self::ffi::nosqldb_get_request_key_set;
pub(crate) mod ffi{
use super::NosqldbGetRequest;
use std::mem;
use crate::{util::{go_type::{NosqldbGetRequestPtr, FFIError, GoErrorPtr, GoString, NosqldbGetRequestKeyPtr}, util::c_char_to_str, go_map::GoMap}, str_to_gostr};
extern "C" {
fn ffi_nosqldb_get_request_new() -> NosqldbGetRequestPtr;
}
pub fn nosqldb_get_request_new(
) -> Result<NosqldbGetRequest, FFIError> {
let nosqldb_get_request_ptr: NosqldbGetRequestPtr = unsafe { ffi_nosqldb_get_request_new() };
Ok(NosqldbGetRequest{ nosqldb_get_request_ptr })
}
extern "C"{
fn ffi_nosqldb_get_request_table_name_set(gtrq: NosqldbGetRequestPtr, tbnm:GoString) -> GoErrorPtr;
}
pub fn nosqldb_get_request_table_name_set(
gtrq: &mut NosqldbGetRequest,
tbnm: &str
)-> Result<(), FFIError> {
str_to_gostr!(tbnm);
let err = unsafe { ffi_nosqldb_get_request_table_name_set(gtrq.nosqldb_get_request_ptr, tbnm) };
if err.is_null() {
Ok(())
} else {
Err(FFIError::GoError(c_char_to_str(err)?))
}
}
extern "C"{
fn ffi_nosqldb_get_request_key_set(gtrq: NosqldbGetRequestPtr, key: NosqldbGetRequestKeyPtr) -> GoErrorPtr;
}
pub fn nosqldb_get_request_key_set(
gtrq: &mut NosqldbGetRequest,
key: GoMap
)-> Result<(), FFIError> {
let err = unsafe { ffi_nosqldb_get_request_key_set(gtrq.nosqldb_get_request_ptr, key.go_map_ptr) };
mem::forget(key);
if err.is_null() {
Ok(())
} else {
Err(FFIError::GoError(c_char_to_str(err)?))
}
}
}
#[derive(Debug)]
pub struct NosqldbGetRequest {
pub(crate) nosqldb_get_request_ptr: NosqldbGetRequestPtr,
}
impl NosqldbGetRequest {
pub fn new () -> Result<Self, FFIError> {
nosqldb_get_request_new()
}
pub fn set_table_name (&mut self, tbnm: &str) -> Result<(), FFIError> {
nosqldb_get_request_table_name_set(self, tbnm)
}
pub fn set_key<T, V> (&mut self, key: HashMap<T, V>) -> Result<(), FFIError>
where
T: AsRef<str> + Serialize,
V: Serialize,
{
nosqldb_get_request_key_set(self, GoMap::from_hash_map(key)?)
}
}
impl Drop for NosqldbGetRequest {
fn drop(&mut self) {
ref_free_drop(self.nosqldb_get_request_ptr);
}
}