use std::convert::TryFrom;
use crate::models::input_transaction::{InputTransaction, UiTransaction};
use crate::models::transaction::Transaction;
use crate::errors::TransactionParseError;
use bs58;
use data_encoding::BASE64;
use serde_json;
use crate::codec::deserialize_transaction;
impl TryFrom<InputTransaction> for Transaction {
type Error = TransactionParseError;
fn try_from(input: InputTransaction) -> Result<Self, Self::Error> {
Transaction::try_from(&input)
}
}
impl TryFrom<&InputTransaction> for Transaction {
type Error = TransactionParseError;
fn try_from(input: &InputTransaction) -> Result<Self, Self::Error> {
match input {
InputTransaction::Base64(s) => {
let raw = BASE64
.decode(s.as_bytes())
.map_err(|e| TransactionParseError::InvalidBase64(e.to_string()))?;
let tx = deserialize_transaction(&raw)
.map_err(|e| TransactionParseError::InvalidFormat(e.to_string()))?;
Ok(tx)
}
InputTransaction::Base58(s) => {
let decoded = bs58::decode(s)
.into_vec()
.map_err(|e| TransactionParseError::InvalidFormat(e.to_string()))?;
let ui_tx: UiTransaction = serde_json::from_slice(&decoded)
.map_err(|e| TransactionParseError::InvalidFormat(e.to_string()))?;
Transaction::try_from(ui_tx)
}
InputTransaction::Json(ui_tx) => Transaction::try_from(ui_tx),
}
}
}