use js_export_macro::js_export;
use miden_client::transaction::{DiscardCause, TransactionStatus as NativeTransactionStatus};
use crate::platform::{JsErr, from_str_err, js_u64_to_u64, u64_to_js_u64};
#[derive(Clone)]
#[js_export]
pub struct TransactionStatus(NativeTransactionStatus);
#[js_export]
impl TransactionStatus {
pub fn pending() -> TransactionStatus {
TransactionStatus(NativeTransactionStatus::Pending)
}
pub fn committed(block_num: u32, commit_timestamp: JsU64) -> TransactionStatus {
TransactionStatus(NativeTransactionStatus::Committed {
block_number: block_num.into(),
commit_timestamp: js_u64_to_u64(commit_timestamp),
})
}
pub fn discarded(cause: String) -> Result<TransactionStatus, JsErr> {
let native_cause = DiscardCause::from_string(&cause)
.map_err(|err| from_str_err(&format!("Invalid discard cause: {err}")))?;
Ok(TransactionStatus(NativeTransactionStatus::Discarded(native_cause)))
}
#[js_export(js_name = "isPending")]
pub fn is_pending(&self) -> bool {
matches!(self.0, NativeTransactionStatus::Pending)
}
#[js_export(js_name = "isCommitted")]
pub fn is_committed(&self) -> bool {
matches!(self.0, NativeTransactionStatus::Committed { .. })
}
#[js_export(js_name = "isDiscarded")]
pub fn is_discarded(&self) -> bool {
matches!(self.0, NativeTransactionStatus::Discarded(_))
}
#[js_export(js_name = "getBlockNum")]
pub fn get_block_num(&self) -> Option<u32> {
match self.0 {
NativeTransactionStatus::Committed { block_number, .. } => Some(block_number.as_u32()),
_ => None,
}
}
#[js_export(js_name = "getCommitTimestamp")]
pub fn get_commit_timestamp(&self) -> Option<JsU64> {
match self.0 {
NativeTransactionStatus::Committed { commit_timestamp, .. } => {
Some(u64_to_js_u64(commit_timestamp))
},
_ => None,
}
}
}
impl From<NativeTransactionStatus> for TransactionStatus {
fn from(native_status: NativeTransactionStatus) -> Self {
TransactionStatus(native_status)
}
}
impl From<&NativeTransactionStatus> for TransactionStatus {
fn from(native_status: &NativeTransactionStatus) -> Self {
TransactionStatus(native_status.clone())
}
}