use std::collections::HashMap;
use serde::Serialize;
use crate::util::go_map::GoMap;
use crate::util::go_type::FFIError;
use crate::util::go_type::NosqldbPutRequestPtr;
use crate::util::util::ref_free_drop;
use self::ffi::nosqldb_put_request_new;
use self::ffi::nosqldb_put_request_set_tablename;
use self::ffi::nosqldb_put_request_set_value;
pub(crate) mod ffi {
use std::mem;
use crate::{util::{go_type::{NosqldbPutRequestPtr, FFIError, GoErrorPtr, GoString, NosqldbValuePtr}, util::c_char_to_str, go_map::GoMap}, str_to_gostr};
use super::NosqldbPutRequest;
extern "C" {
fn ffi_nosqldb_put_request_new() -> NosqldbPutRequestPtr;
}
pub fn nosqldb_put_request_new(
) -> Result<NosqldbPutRequest, FFIError> {
let nosqldb_put_request_ptr: NosqldbPutRequestPtr = unsafe { ffi_nosqldb_put_request_new() };
Ok(NosqldbPutRequest{ nosqldb_put_request_ptr })
}
extern "C"{
fn ffi_nosqldb_put_request_set_tablename(ptrq: NosqldbPutRequestPtr, tbnm:GoString) -> GoErrorPtr;
}
pub fn nosqldb_put_request_set_tablename(
ptrq: &mut NosqldbPutRequest,
tbnm: &str
)-> Result<(), FFIError> {
str_to_gostr!(tbnm);
let err = unsafe { ffi_nosqldb_put_request_set_tablename(ptrq.nosqldb_put_request_ptr, tbnm) };
if err.is_null() {
Ok(())
} else {
Err(FFIError::GoError(c_char_to_str(err)?))
}
}
extern "C"{
fn ffi_nosqldb_put_request_set_value(ptrq: NosqldbPutRequestPtr, value: NosqldbValuePtr) -> GoErrorPtr;
}
pub fn nosqldb_put_request_set_value(
ptrq: &mut NosqldbPutRequest,
value: GoMap
)-> Result<(), FFIError> {
let err = unsafe { ffi_nosqldb_put_request_set_value(ptrq.nosqldb_put_request_ptr, value.go_map_ptr) };
mem::forget(value);
if err.is_null() {
Ok(())
} else {
Err(FFIError::GoError(c_char_to_str(err)?))
}
}
}
#[derive(Debug)]
pub struct NosqldbPutRequest {
pub(crate) nosqldb_put_request_ptr: NosqldbPutRequestPtr,
}
impl NosqldbPutRequest {
pub fn new () -> Result<Self, FFIError> {
nosqldb_put_request_new()
}
pub fn set_table_name (&mut self, tbnm: &str) -> Result<(), FFIError> {
nosqldb_put_request_set_tablename(self, tbnm)
}
pub fn set_value<T, V> (&mut self, value: HashMap<T, V>) -> Result<(), FFIError>
where
T: AsRef<str> + Serialize,
V: Serialize,
{
nosqldb_put_request_set_value(self, GoMap::from_hash_map(value)?)
}
}
impl Drop for NosqldbPutRequest {
fn drop(&mut self) {
ref_free_drop(self.nosqldb_put_request_ptr);
}
}