Lines
77.44 %
Functions
47.83 %
Branches
100 %
//! Transaction-domain natives. Wraps `server::command::{CreateTransaction,
//! ListTransactions, GetTransaction, UpdateTransaction, DeleteTransaction}`.
mod logical_common;
mod parse;
mod render;
mod run;
mod run_logical;
#[cfg(test)]
mod tests;
mod tests_get_transaction;
mod tests_logical;
mod tests_logical_update;
mod tests_parse;
use scripting::runtime::{alloc_string_ref, read_string_arg};
use wasmtime::{ArrayRef, Caller, Linker, Rooted, StructRef};
use crate::session::SessionData;
use render::alloc_transaction_chain;
use run::{
run_create_transaction, run_delete_transaction, run_get_transaction,
run_get_transaction_detail, run_get_transaction_tag, run_list_transactions,
run_set_transaction_tag, run_update_transaction,
};
use run_logical::{run_create_transaction_logical, run_update_transaction_logical};
pub const REGISTERED_COMMANDS: &[&str] = &[
"create-transaction",
"create-transaction-logical",
"list-transactions",
"get-transaction",
"get-transaction-detail",
"update-transaction",
"update-transaction-logical",
"delete-transaction",
"set-transaction-tag",
"get-transaction-tag",
];
pub fn register(linker: &mut Linker<SessionData>) -> wasmtime::Result<()> {
register_readonly(linker)?;
register_mutators(linker)?;
Ok(())
}
pub fn register_readonly(linker: &mut Linker<SessionData>) -> wasmtime::Result<()> {
linker.func_wrap_async(
"nomi",
"transaction_list_transactions",
|mut caller: Caller<'_, SessionData>,
(account_arg,): (Option<Rooted<ArrayRef>>,)|
-> Box<
dyn std::future::Future<Output = wasmtime::Result<Option<Rooted<StructRef>>>> + Send,
> {
Box::new(async move {
let user_id = caller.data().ctx().user_id;
let account_str = read_string_arg(&mut caller, account_arg)?;
let result = run_list_transactions(user_id, account_str).await?;
alloc_transaction_chain(&mut caller, result).await
})
},
)?;
"transaction_get_transaction",
(id_arg,): (Option<Rooted<ArrayRef>>,)|
let id = read_string_arg(&mut caller, id_arg)?;
run_get_transaction(&mut caller, user_id, id).await
"transaction_get_transaction_detail",
dyn std::future::Future<Output = wasmtime::Result<Option<Rooted<ArrayRef>>>> + Send,
let plist = run_get_transaction_detail(user_id, id).await?;
Ok(match plist {
Some(s) => Some(alloc_string_ref(&mut caller, s.as_bytes())?),
None => None,
"transaction_get_transaction_tag",
(id_arg, name_arg): (Option<Rooted<ArrayRef>>, Option<Rooted<ArrayRef>>)|
let name = read_string_arg(&mut caller, name_arg)?;
let value = run_get_transaction_tag(user_id, id, name).await?;
Ok(Some(alloc_string_ref(&mut caller, value.as_bytes())?))
pub fn register_mutators(linker: &mut Linker<SessionData>) -> wasmtime::Result<()> {
"transaction_delete_transaction",
-> Box<dyn std::future::Future<Output = wasmtime::Result<i32>> + Send> {
run_delete_transaction(user_id, id).await
"transaction_create_transaction",
(payload_arg,): (Option<Rooted<ArrayRef>>,)|
let payload = read_string_arg(&mut caller, payload_arg)?;
let id = run_create_transaction(user_id, payload).await?;
Ok(Some(alloc_string_ref(&mut caller, id.as_bytes())?))
"transaction_create_transaction_logical",
let id = run_create_transaction_logical(user_id, payload).await?;
"transaction_update_transaction",
let id = run_update_transaction(user_id, payload).await?;
"transaction_update_transaction_logical",
let id = run_update_transaction_logical(user_id, payload).await?;
"transaction_set_transaction_tag",
(id_arg, name_arg, value_arg): super::StringArgTriple|
let value = read_string_arg(&mut caller, value_arg)?;
run_set_transaction_tag(user_id, id, name, value).await