#![allow(unused_imports)]
#![allow(non_snake_case)]
#![allow(dead_code)]
use std::borrow::{ Borrow, BorrowMut };
use std::collections::HashMap;
use serde_with::serde_as;
use wtools as wt;
use super::system::*;
use super::digest::*;
use super::chain::*;
#[ serde_as ]
#[ repr( C ) ]
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct TransactionGeneric< T : ?Sized >
{
pub sender : Digest,
#[ serde_as( as = "HashMap<serde_with::json::JsonString, _>" ) ]
pub receiver : HashMap< Digest, f64 >,
pub amount : f64,
pub time : i64,
pub body : T,
}
pub type TransactionHeader = TransactionGeneric< () >;
#[ derive( Debug, Clone, Serialize, Deserialize ) ]
pub struct TransactionRestricts
{
pub hash : Digest,
}
pub type Transaction = TransactionGeneric< TransactionRestricts >;
impl TransactionHeader
{
pub fn form( &self ) -> Transaction
{
Transaction::new( self )
}
}
impl Transaction
{
pub fn new( body : &TransactionHeader ) -> Transaction
{
let hash = hash_single( &body );
Transaction
{
sender : body.sender.clone(),
receiver : body.receiver.clone(),
amount : body.amount,
time : body.time,
body : TransactionRestricts{ hash },
}
}
}
impl Borrow< TransactionHeader > for Transaction
{
fn borrow<'a>( &'a self ) -> &'a TransactionHeader
{
unsafe
{
std::mem::transmute::< &'a Transaction, &'a TransactionHeader >( self )
}
}
}
impl BorrowMut< TransactionHeader > for Transaction
{
fn borrow_mut<'a>( &'a mut self ) -> &'a mut TransactionHeader
{
unsafe
{
std::mem::transmute::< &'a mut Transaction, &'a mut TransactionHeader >( self )
}
}
}
impl System
{
pub fn transaction_create( &mut self, sender : String, receiver : String, amount : f64 )
{
let sender_digest = Digest::from( Vec::from( sender.as_bytes() ) );
let receiver_digest = Digest::from( Vec::from( receiver.as_bytes() ) );
self.chain.transaction_create( sender_digest, receiver_digest, amount );
}
}
impl Chain
{
pub fn transaction_create( &mut self, _sender : Digest, _receiver : Digest, _amount : f64 )
{
unimplemented!( "not implemented" );
}
pub fn balance_get( &mut self, _public_key : &Digest ) -> f64
{
1.0
}
}