use std::fmt::Debug;
use std::io;
use std::str::FromStr;
use crate::blockchain::Network;
use crate::consensus::{self, Decodable, Encodable};
use crate::crypto::{self, AccordantKeySet};
#[derive(Display, Debug, Clone, Hash, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[display(Debug)]
pub enum TradeRole {
Maker,
Taker,
}
impl TradeRole {
pub fn other(&self) -> Self {
match self {
Self::Maker => Self::Taker,
Self::Taker => Self::Maker,
}
}
}
impl Encodable for TradeRole {
fn consensus_encode<W: io::Write>(&self, writer: &mut W) -> Result<usize, io::Error> {
match self {
TradeRole::Maker => 0x01u8.consensus_encode(writer),
TradeRole::Taker => 0x02u8.consensus_encode(writer),
}
}
}
impl Decodable for TradeRole {
fn consensus_decode<D: io::Read>(d: &mut D) -> Result<Self, consensus::Error> {
match Decodable::consensus_decode(d)? {
0x01u8 => Ok(TradeRole::Maker),
0x02u8 => Ok(TradeRole::Taker),
_ => Err(consensus::Error::UnknownType),
}
}
}
impl_strict_encoding!(TradeRole);
impl FromStr for TradeRole {
type Err = consensus::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Maker" | "maker" => Ok(TradeRole::Maker),
"Taker" | "taker" => Ok(TradeRole::Taker),
_ => Err(consensus::Error::UnknownType),
}
}
}
#[derive(Display, Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[display(Debug)]
pub enum SwapRole {
Alice,
Bob,
}
impl SwapRole {
pub fn other(&self) -> Self {
match self {
Self::Alice => Self::Bob,
Self::Bob => Self::Alice,
}
}
}
impl Encodable for SwapRole {
fn consensus_encode<W: io::Write>(&self, writer: &mut W) -> Result<usize, io::Error> {
match self {
SwapRole::Alice => 0x01u8.consensus_encode(writer),
SwapRole::Bob => 0x02u8.consensus_encode(writer),
}
}
}
impl Decodable for SwapRole {
fn consensus_decode<D: io::Read>(d: &mut D) -> Result<Self, consensus::Error> {
match Decodable::consensus_decode(d)? {
0x01u8 => Ok(SwapRole::Alice),
0x02u8 => Ok(SwapRole::Bob),
_ => Err(consensus::Error::UnknownType),
}
}
}
impl_strict_encoding!(SwapRole);
impl FromStr for SwapRole {
type Err = consensus::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Alice" | "alice" => Ok(SwapRole::Alice),
"Bob" | "bob" => Ok(SwapRole::Bob),
_ => Err(consensus::Error::UnknownType),
}
}
}
pub trait Accordant<Pk, Sk, Addr> {
fn derive_lock_address(
network: Network,
keys: AccordantKeySet<Pk, Sk>,
) -> Result<Addr, crypto::Error>;
}