use super::constant_store::ConstantStore;
use super::val_def_type_store::ValDefTypeStore;
use sigma_ser::vlq_encode::ReadSigmaVlqExt;
use std::io::Cursor;
use std::io::Read;
pub struct SigmaByteReader<R> {
inner: R,
constant_store: ConstantStore,
substitute_placeholders: bool,
val_def_type_store: ValDefTypeStore,
}
impl<R: Read> SigmaByteReader<R> {
pub fn new(pr: R, constant_store: ConstantStore) -> SigmaByteReader<R> {
SigmaByteReader {
inner: pr,
constant_store,
substitute_placeholders: false,
val_def_type_store: ValDefTypeStore::new(),
}
}
pub fn new_with_substitute_placeholders(
pr: R,
constant_store: ConstantStore,
) -> SigmaByteReader<R> {
SigmaByteReader {
inner: pr,
constant_store,
substitute_placeholders: true,
val_def_type_store: ValDefTypeStore::new(),
}
}
}
pub fn from_bytes<T: AsRef<[u8]>>(bytes: T) -> SigmaByteReader<Cursor<T>> {
SigmaByteReader {
inner: Cursor::new(bytes),
constant_store: ConstantStore::empty(),
substitute_placeholders: false,
val_def_type_store: ValDefTypeStore::new(),
}
}
pub trait SigmaByteRead: ReadSigmaVlqExt {
fn constant_store(&mut self) -> &mut ConstantStore;
fn substitute_placeholders(&self) -> bool;
fn set_constant_store(&mut self, constant_store: ConstantStore);
fn val_def_type_store(&mut self) -> &mut ValDefTypeStore;
}
impl<R: Read> Read for SigmaByteReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.inner.read(buf)
}
}
impl<R: ReadSigmaVlqExt> SigmaByteRead for SigmaByteReader<R> {
fn constant_store(&mut self) -> &mut ConstantStore {
&mut self.constant_store
}
fn substitute_placeholders(&self) -> bool {
self.substitute_placeholders
}
fn set_constant_store(&mut self, constant_store: ConstantStore) {
self.constant_store = constant_store;
}
fn val_def_type_store(&mut self) -> &mut ValDefTypeStore {
&mut self.val_def_type_store
}
}