use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use script::Script;
use std::io;
use std::io::{Read, Write};
use util::{var_int, Amount, Result, Serializable};
#[derive(Debug, PartialEq, Eq, Hash, Clone)]
pub struct TxOut {
pub amount: Amount,
pub pk_script: Script,
}
impl TxOut {
pub fn size(&self) -> usize {
8 + var_int::size(self.pk_script.0.len() as u64) + self.pk_script.0.len()
}
}
impl Serializable<TxOut> for TxOut {
fn read(reader: &mut dyn Read) -> Result<TxOut> {
let amount = Amount(reader.read_i64::<LittleEndian>()?);
let script_len = var_int::read(reader)?;
let mut pk_script = Script(vec![0; script_len as usize]);
reader.read(&mut pk_script.0)?;
Ok(TxOut { amount, pk_script })
}
fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
writer.write_i64::<LittleEndian>(self.amount.0)?;
var_int::write(self.pk_script.0.len() as u64, writer)?;
writer.write(&self.pk_script.0)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Cursor;
#[test]
fn write_read() {
let mut v = Vec::new();
let t = TxOut {
amount: Amount(4400044000),
pk_script: Script(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 99, 98, 97, 96]),
};
t.write(&mut v).unwrap();
assert!(v.len() == t.size());
assert!(TxOut::read(&mut Cursor::new(&v)).unwrap() == t);
}
}