use js_export_macro::js_export;
use miden_client::note::Note as NativeNote;
use miden_client::transaction::TransactionRequest as NativeTransactionRequest;
use miden_client::vm::AdviceMap as NativeAdviceMap;
use crate::models::advice_map::AdviceMap;
use crate::models::note::Note;
use crate::models::word::Word;
use crate::platform::{JsBytes, JsErr};
use crate::utils::{deserialize_from_bytes, serialize_to_bytes};
pub mod note_and_args;
pub mod note_details_and_tag;
pub mod note_id_and_args;
pub mod transaction_request_builder;
use note_details_and_tag::NoteDetailsAndTag;
#[derive(Clone)]
#[js_export]
pub struct TransactionRequest(NativeTransactionRequest);
#[js_export]
impl TransactionRequest {
pub fn serialize(&self) -> JsBytes {
serialize_to_bytes(&self.0)
}
pub fn deserialize(bytes: JsBytes) -> Result<TransactionRequest, JsErr> {
deserialize_from_bytes::<NativeTransactionRequest>(&bytes).map(TransactionRequest)
}
#[js_export(js_name = "expectedOutputOwnNotes")]
pub fn expected_output_own_notes(&self) -> Result<Vec<Note>, JsErr> {
let native_notes: Vec<NativeNote> = self.0.expected_output_own_notes();
let notes: Vec<Note> = native_notes.into_iter().map(Into::into).collect();
Ok(notes)
}
#[js_export(js_name = "expectedFutureNotes")]
pub fn expected_future_notes(&self) -> Result<Vec<NoteDetailsAndTag>, JsErr> {
self.0
.expected_future_notes()
.cloned() .map(|(note_details, note_tag)| {
Ok(NoteDetailsAndTag::new(
note_details.into(),
note_tag.into()
))
})
.collect::<Result<Vec<NoteDetailsAndTag>, _>>()
}
#[js_export(js_name = "scriptArg")]
pub fn script_arg(&self) -> Option<Word> {
self.0.script_arg().map(Word::from)
}
#[js_export(js_name = "authArg")]
pub fn auth_arg(&self) -> Option<Word> {
self.0.auth_arg().map(Word::from)
}
#[js_export(js_name = "adviceMap")]
pub fn advice_map(&self) -> AdviceMap {
self.0.advice_map().into()
}
#[js_export(js_name = "extendAdviceMap")]
pub fn extend_advice_map(&self, advice_map: &AdviceMap) -> TransactionRequest {
let native_advice_map: NativeAdviceMap = advice_map.into();
let mut native_request = self.0.clone();
native_request
.advice_map_mut()
.extend(native_advice_map.iter().map(|(key, value)| (*key, value.clone())));
native_request.into()
}
}
impl From<TransactionRequest> for NativeTransactionRequest {
fn from(transaction_request: TransactionRequest) -> Self {
transaction_request.0
}
}
impl From<&TransactionRequest> for NativeTransactionRequest {
fn from(transaction_request: &TransactionRequest) -> Self {
transaction_request.0.clone()
}
}
impl From<NativeTransactionRequest> for TransactionRequest {
fn from(transaction_request: NativeTransactionRequest) -> Self {
TransactionRequest(transaction_request)
}
}
impl From<&NativeTransactionRequest> for TransactionRequest {
fn from(transaction_request: &NativeTransactionRequest) -> Self {
TransactionRequest(transaction_request.clone())
}
}