use std::io;
use strict_encoding::{StrictDecode, StrictEncode};
pub const BIFROST_APP_STORM: u16 = 0x0001;
pub const BIFROST_APP_VENDOR_MASK: u16 = 0x8000;
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)]
pub enum BifrostApp {
#[display("storm")]
Storm,
#[display("future({0:#06})")]
Future(u16),
#[display("vendor({0:#06})")]
Vendor(u16),
}
impl BifrostApp {
pub fn app_code(self) -> u16 {
match self {
BifrostApp::Storm => BIFROST_APP_STORM,
BifrostApp::Future(app) => app,
BifrostApp::Vendor(vendor) => vendor,
}
}
}
impl StrictEncode for BifrostApp {
fn strict_encode<E: io::Write>(
&self,
e: E,
) -> Result<usize, strict_encoding::Error> {
self.app_code().strict_encode(e)
}
}
impl StrictDecode for BifrostApp {
fn strict_decode<D: io::Read>(
d: D,
) -> Result<Self, strict_encoding::Error> {
u16::strict_decode(d).map(BifrostApp::from)
}
}
impl From<BifrostApp> for u16 {
fn from(app: BifrostApp) -> Self {
app.app_code()
}
}
impl From<u16> for BifrostApp {
fn from(code: u16) -> Self {
match code {
BIFROST_APP_STORM => BifrostApp::Storm,
vendor if vendor & BIFROST_APP_VENDOR_MASK > 0 => {
BifrostApp::Vendor(vendor)
}
future => BifrostApp::Future(future),
}
}
}