use std::fmt::Debug;
use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
pub const TESTNET_MAGIC: u64 = 1097911063;
pub const MAINNET_MAGIC: u64 = 764824073;
pub const PREVIEW_MAGIC: u64 = 2;
pub const PREPROD_MAGIC: u64 = 1;
pub const PRE_PRODUCTION_MAGIC: u64 = 1;
pub const SANCHONET_MAGIC: u64 = 4;
pub const PROTOCOL_CLIENT: u16 = 0x0;
pub const PROTOCOL_SERVER: u16 = 0x8000;
pub const PROTOCOL_N2N_HANDSHAKE: u16 = 0;
pub const PROTOCOL_N2N_CHAIN_SYNC: u16 = 2;
pub const PROTOCOL_N2N_BLOCK_FETCH: u16 = 3;
pub const PROTOCOL_N2N_TX_SUBMISSION: u16 = 4;
pub const PROTOCOL_N2N_KEEP_ALIVE: u16 = 8;
pub const PROTOCOL_N2C_HANDSHAKE: u16 = 0;
pub const PROTOCOL_N2C_CHAIN_SYNC: u16 = 5;
pub const PROTOCOL_N2C_TX_SUBMISSION: u16 = 6;
pub const PROTOCOL_N2C_STATE_QUERY: u16 = 7;
pub const PROTOCOL_N2C_TX_MONITOR: u16 = 9;
#[derive(Clone, Eq, PartialEq, Hash)]
pub enum Point {
Origin,
Specific(u64, Vec<u8>),
}
impl Point {
pub fn slot_or_default(&self) -> u64 {
match self {
Point::Origin => 0,
Point::Specific(slot, _) => *slot,
}
}
}
impl Debug for Point {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Origin => write!(f, "Origin"),
Self::Specific(arg0, arg1) => write!(f, "({}, {})", arg0, hex::encode(arg1)),
}
}
}
impl Point {
pub fn new(slot: u64, hash: Vec<u8>) -> Self {
Point::Specific(slot, hash)
}
}
impl Encode<()> for Point {
fn encode<W: encode::Write>(
&self,
e: &mut Encoder<W>,
_ctx: &mut (),
) -> Result<(), encode::Error<W::Error>> {
match self {
Point::Origin => e.array(0)?,
Point::Specific(slot, hash) => e.array(2)?.u64(*slot)?.bytes(hash)?,
};
Ok(())
}
}
impl<'b> Decode<'b, ()> for Point {
fn decode(d: &mut Decoder<'b>, _ctx: &mut ()) -> Result<Self, decode::Error> {
let size = d.array()?;
match size {
Some(0) => Ok(Point::Origin),
Some(2) => {
let slot = d.u64()?;
let hash = d.bytes()?;
Ok(Point::Specific(slot, Vec::from(hash)))
}
_ => Err(decode::Error::message(
"can't decode Point from array of size",
)),
}
}
}