use http_req::request;
use lazy_static::lazy_static;
use serde_json::Value;
lazy_static! {
static ref STORE_API_PREFIX: String = String::from(
std::option_env!("STORE_API_PREFIX").unwrap_or("https://store.flows.network/api")
);
}
extern "C" {
fn get_flows_user(p: *mut u8) -> i32;
fn get_flow_id(p: *mut u8) -> i32;
fn set_error_log(p: *const u8, len: i32);
}
pub enum ExpireKind {
Ex,
ExAt,
}
pub struct Expire {
pub kind: ExpireKind,
pub value: i64,
}
pub fn set(key: &str, value: Value, expire: Option<Expire>) {
unsafe {
let mut flows_user = Vec::<u8>::with_capacity(100);
let c = get_flows_user(flows_user.as_mut_ptr());
flows_user.set_len(c as usize);
let flows_user = String::from_utf8(flows_user).unwrap();
let mut flow_id = Vec::<u8>::with_capacity(100);
let c = get_flow_id(flow_id.as_mut_ptr());
if c == 0 {
panic!("Failed to get flow id");
}
flow_id.set_len(c as usize);
let flow_id = String::from_utf8(flow_id).unwrap();
let mut writer = Vec::new();
let mut x = serde_json::json!({
"key": key,
"value": value
});
if let Some(exp) = expire {
match exp.kind {
ExpireKind::Ex => {
x.as_object_mut()
.unwrap()
.insert(String::from("ex"), Value::from(exp.value));
}
ExpireKind::ExAt => {
x.as_object_mut()
.unwrap()
.insert(String::from("exat"), Value::from(exp.value));
}
}
}
let x = serde_json::to_vec(&x).unwrap();
let res = request::post(
format!(
"{}/{}/{}/set",
STORE_API_PREFIX.as_str(),
flows_user,
flow_id
),
&x,
&mut writer,
)
.unwrap();
match res.status_code().is_success() {
true => {}
false => {
set_error_log(writer.as_ptr(), writer.len() as i32);
}
}
}
}
pub fn get(key: &str) -> Option<Value> {
unsafe {
let mut flows_user = Vec::<u8>::with_capacity(100);
let c = get_flows_user(flows_user.as_mut_ptr());
flows_user.set_len(c as usize);
let flows_user = String::from_utf8(flows_user).unwrap();
let mut flow_id = Vec::<u8>::with_capacity(100);
let c = get_flow_id(flow_id.as_mut_ptr());
if c == 0 {
panic!("Failed to get flow id");
}
flow_id.set_len(c as usize);
let flow_id = String::from_utf8(flow_id).unwrap();
let mut writer = Vec::new();
let res = request::post(
format!(
"{}/{}/{}/get",
STORE_API_PREFIX.as_str(),
flows_user,
flow_id
),
key.as_bytes(),
&mut writer,
)
.unwrap();
match res.status_code().is_success() {
true => match serde_json::from_slice::<Value>(&writer) {
Ok(v) => Some(v),
Err(_) => None,
},
false => None,
}
}
}
pub fn del(key: &str) -> Option<Value> {
unsafe {
let mut flows_user = Vec::<u8>::with_capacity(100);
let c = get_flows_user(flows_user.as_mut_ptr());
flows_user.set_len(c as usize);
let flows_user = String::from_utf8(flows_user).unwrap();
let mut flow_id = Vec::<u8>::with_capacity(100);
let c = get_flow_id(flow_id.as_mut_ptr());
if c == 0 {
panic!("Failed to get flow id");
}
flow_id.set_len(c as usize);
let flow_id = String::from_utf8(flow_id).unwrap();
let mut writer = Vec::new();
let res = request::post(
format!(
"{}/{}/{}/del",
STORE_API_PREFIX.as_str(),
flows_user,
flow_id
),
key.as_bytes(),
&mut writer,
)
.unwrap();
match res.status_code().is_success() {
true => match serde_json::from_slice::<Value>(&writer) {
Ok(v) => Some(v),
Err(_) => None,
},
false => None,
}
}
}