use std::sync::Arc;
use parking_lot::Mutex as ParkingMutex;
use crate::custom::custom_command_manager::{
CommandType, CustomCommandDocs, CustomCommandInfo, CustomCommandManager, CustomTransaction,
RawStringCommandSpec, RawStringFn,
};
pub struct RegisterApi {
command_manager: Arc<ParkingMutex<CustomCommandManager>>,
}
impl RegisterApi {
pub fn new(command_manager: Arc<ParkingMutex<CustomCommandManager>>) -> Self {
Self { command_manager }
}
pub fn new_command(
&self,
name: &str,
command_type: CommandType,
custom_functions: RawStringFn,
command_info: Option<CustomCommandInfo>,
command_docs: Option<CustomCommandDocs>,
expiration_ticks: i64,
) -> Result<u16, &'static str> {
self
.command_manager
.lock()
.register_raw_string_command(RawStringCommandSpec {
name,
command_type,
functions: custom_functions,
command_info,
command_docs,
expiration_ticks,
})
}
pub fn new_transaction_proc(
&self,
name: &str,
command_info: Option<CustomCommandInfo>,
command_docs: Option<CustomCommandDocs>,
) -> Result<u8, &'static str> {
self
.command_manager
.lock()
.register_transaction(name, command_info, command_docs)
}
pub fn new_type(&self, type_name: &str) -> Result<u8, &'static str> {
self.command_manager.lock().register_type(type_name)
}
pub fn new_command_object(
&self,
type_name: &str,
name: &str,
command_type: CommandType,
command_info: Option<CustomCommandInfo>,
command_docs: Option<CustomCommandDocs>,
) -> Result<(u8, u8), &'static str> {
self.command_manager.lock().register_object_command(
type_name,
name,
command_type,
command_info,
command_docs,
)
}
pub fn new_procedure(
&self,
name: &str,
command_info: Option<CustomCommandInfo>,
command_docs: Option<CustomCommandDocs>,
) -> Result<u8, &'static str> {
self
.command_manager
.lock()
.register_procedure(name, command_info, command_docs)
}
pub fn new_module(&self, module_name: &str, version: u32) -> Result<(), &'static str> {
self
.command_manager
.lock()
.register_module(module_name, version)
}
pub fn get_custom_transaction_procedure(&self, txn_id: u8) -> Option<CustomTransaction> {
self
.command_manager
.lock()
.try_get_custom_transaction_procedure(txn_id)
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use super::*;
use crate::custom::custom_command_manager::CommandType;
#[test]
fn registers_commands_transactions_and_modules() {
let manager = Arc::new(ParkingMutex::new(CustomCommandManager::new()));
let api = RegisterApi::new(manager.clone());
let functions: RawStringFn = Arc::new(|_args: &[&[u8]]| b"ok".to_vec());
let cmd_id = api
.new_command("MYCMD", CommandType::Read, functions, None, None, 0)
.expect("原始命令注册成功");
assert!(manager.lock().try_get_custom_command(cmd_id).is_some());
let txn_id = api
.new_transaction_proc("MYTXN", None, None)
.expect("事务过程注册成功");
assert!(api.get_custom_transaction_procedure(txn_id).is_some());
let type_id = api.new_type("MyType").expect("类型注册成功");
let (obj_type, sub_id) = api
.new_command_object("MyType", "MYOBJCMD", CommandType::Read, None, None)
.expect("对象命令注册成功");
assert_eq!(obj_type, type_id);
assert_eq!(sub_id, 0);
let proc_id = api
.new_procedure("MYPROC", None, None)
.expect("过程注册成功");
assert!(manager.lock().try_get_custom_procedure(proc_id).is_some());
api.new_module("MyModule", 1).expect("模块注册成功");
assert!(api.new_module("MyModule", 1).is_err()); }
}