use crate::SResult;
use super::bsl;
#[allow(clippy::len_without_is_empty)]
pub trait Parse<'a>: Sized + AsRef<[u8]> {
fn parse(slice: &'a [u8]) -> SResult<'a, Self>;
fn len(&self) -> usize {
self.as_ref().len()
}
}
#[allow(clippy::len_without_is_empty)]
pub trait Visit<'a>: Sized + AsRef<[u8]> {
fn visit<'b, V: Visitor>(slice: &'a [u8], visit: &'b mut V) -> SResult<'a, Self>;
fn len(&self) -> usize {
self.as_ref().len()
}
}
impl<'a, T: Visit<'a>> Parse<'a> for T {
fn parse(slice: &'a [u8]) -> SResult<'a, Self> {
Self::visit(slice, &mut EmptyVisitor {})
}
}
#[allow(unused)]
pub trait Visitor {
fn visit_block_header(&mut self, header: &bsl::BlockHeader) {}
fn visit_block_begin(&mut self, total_transactions: usize) {}
fn visit_transaction(&mut self, tx: &bsl::Transaction) {}
fn visit_tx_ins(&mut self, total_inputs: usize) {}
fn visit_tx_in(&mut self, vin: usize, tx_in: &bsl::TxIn) {}
fn visit_tx_outs(&mut self, total_outputs: usize) {}
fn visit_tx_out(&mut self, vout: usize, tx_out: &bsl::TxOut) {}
fn visit_witness(&mut self, vin: usize) {}
fn visit_witness_total_element(&mut self, witness_total: usize) {}
fn visit_witness_element(&mut self, witness_i: usize, witness_element: &[u8]) {}
fn visit_witness_end(&mut self) {}
}
pub struct EmptyVisitor {}
impl Visitor for EmptyVisitor {}