use crate::serialization::sigma_byte_reader::SigmaByteRead;
use crate::serialization::sigma_byte_writer::SigmaByteWrite;
use crate::serialization::SigmaParsingError;
use crate::serialization::SigmaSerializable;
use crate::serialization::SigmaSerializeResult;
use super::expr::Expr;
use super::expr::InvalidArgumentError;
pub trait OneArgOp {
fn input(&self) -> &Expr;
}
pub trait OneArgOpTryBuild: Sized {
fn try_build(input: Expr) -> Result<Self, InvalidArgumentError>;
}
impl<T: OneArgOp + OneArgOpTryBuild> SigmaSerializable for T {
fn sigma_serialize<W: SigmaByteWrite>(&self, w: &mut W) -> SigmaSerializeResult {
self.input().sigma_serialize(w)
}
fn sigma_parse<R: SigmaByteRead>(r: &mut R) -> Result<Self, SigmaParsingError> {
let input = Expr::sigma_parse(r)?;
let r = T::try_build(input)?;
Ok(r)
}
}