use crate::cesr::indexing::{idx_sig_dex, BaseIndexer, Indexer};
use crate::cesr::verfer::Verfer;
use crate::cesr::Parsable;
use crate::errors::MatterError;
use crate::Matter;
use std::any::Any;
#[derive(Debug, Clone)]
pub struct Siger {
base: BaseIndexer,
verfer: Option<Verfer>,
}
impl Siger {
pub fn new(
raw: Option<&[u8]>,
code: Option<&str>,
index: Option<u32>,
ondex: Option<u32>,
verfer: Option<Verfer>,
) -> Result<Self, MatterError> {
if !idx_sig_dex::TUPLE.contains(&(code.unwrap())) {
return Err(MatterError::UnsupportedCodeError(String::from(
code.unwrap(),
)));
}
let base = BaseIndexer::new(raw, code, index, ondex)?;
Ok(Siger { base, verfer })
}
pub fn from_raw(raw: Option<&[u8]>, verfer: Option<Verfer>) -> Result<Self, MatterError> {
let base = BaseIndexer::from_raw(raw)?;
Ok(Siger { base, verfer })
}
pub fn from_qb64(qb64: &str, verfer: Option<Verfer>) -> Result<Self, MatterError> {
let base = BaseIndexer::from_qb64(qb64)?;
if !idx_sig_dex::TUPLE.contains(&(base.code())) {
return Err(MatterError::UnsupportedCodeError(String::from(base.code())));
}
Ok(Siger { base, verfer })
}
pub fn verfer(&self) -> Option<Verfer> {
self.verfer.clone()
}
pub fn set_verfer(&mut self, verfer: Verfer) {
self.verfer = Some(verfer);
}
}
impl Parsable for Siger {
fn from_qb64b(data: &mut Vec<u8>, strip: Option<bool>) -> Result<Self, MatterError> {
let base = BaseIndexer::from_qb64b(data, strip)?;
if !idx_sig_dex::TUPLE.contains(&(base.code())) {
return Err(MatterError::UnsupportedCodeError(String::from(base.code())));
}
Ok(Siger { base, verfer: None })
}
fn from_qb2(data: &mut Vec<u8>, strip: Option<bool>) -> Result<Self, MatterError> {
let base = BaseIndexer::from_qb2(data, strip)?;
if !idx_sig_dex::TUPLE.contains(&(base.code())) {
return Err(MatterError::UnsupportedCodeError(String::from(base.code())));
}
Ok(Siger { base, verfer: None })
}
}
impl Indexer for Siger {
fn index(&self) -> u32 {
self.base.index()
}
fn ondex(&self) -> Option<u32> {
self.base.ondex()
}
}
impl Matter for Siger {
fn code(&self) -> &str {
self.base.code()
}
fn raw(&self) -> &[u8] {
self.base.raw()
}
fn qb64(&self) -> String {
self.base.qb64()
}
fn qb64b(&self) -> Vec<u8> {
self.base.qb64b()
}
fn qb2(&self) -> Vec<u8> {
self.base.qb2()
}
fn soft(&self) -> &str {
""
}
fn full_size(&self) -> usize {
self.base.full_size() as usize
}
fn size(&self) -> usize {
0
}
fn is_transferable(&self) -> bool {
false
}
fn is_digestive(&self) -> bool {
false
}
fn is_prefixive(&self) -> bool {
false
}
fn is_special(&self) -> bool {
false
}
fn as_any(&self) -> &dyn Any {
self
}
}