use std::error::Error;
use std::fmt::Debug;
use std::str::FromStr;
use bc::Tx;
use commit_verify::mpc;
use strict_encoding::{StrictDecode, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize};
use crate::LIB_NAME_BPCORE;
#[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)]
#[display(doc_comments)]
pub struct MethodParseError(pub String);
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_BPCORE, tags = repr, into_u8, try_from_u8)]
#[repr(u8)]
pub enum Method {
#[display("opret1st")]
#[strict_type(dumb)]
OpretFirst = 0x00,
#[display("tapret1st")]
TapretFirst = 0x01,
}
impl FromStr for Method {
type Err = MethodParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s.to_lowercase() {
s if s == Method::OpretFirst.to_string() => Method::OpretFirst,
s if s == Method::TapretFirst.to_string() => Method::TapretFirst,
_ => return Err(MethodParseError(s.to_owned())),
})
}
}
pub trait Proof: Clone + Eq + Debug + StrictSerialize + StrictDeserialize + StrictDumb {
const METHOD: Method;
type Error: Clone + Error;
fn verify(&self, msg: &mpc::Commitment, tx: &Tx) -> Result<(), Self::Error>;
}