use strict_encoding::constants::U64;
use strict_types::SemId;
use crate::{StateType, LIB_NAME_RGB};
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB, tags = repr, into_u8, try_from_u8)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
#[non_exhaustive]
#[repr(u8)]
pub enum MediaType {
#[display("*/*")]
#[strict_type(dumb)]
Any = 0xFF,
}
impl MediaType {
pub fn conforms(&self, other: &MediaType) -> bool {
match (self, other) {
(MediaType::Any, MediaType::Any) => true,
}
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB, tags = order)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub enum StateSchema {
#[strict_type(dumb)]
Declarative,
Fungible(FungibleType),
Structured(SemId),
Attachment(MediaType),
}
impl StateSchema {
pub fn state_type(&self) -> StateType {
match self {
StateSchema::Declarative => StateType::Void,
StateSchema::Fungible(_) => StateType::Fungible,
StateSchema::Structured(_) => StateType::Structured,
StateSchema::Attachment(_) => StateType::Attachment,
}
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Display)]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB, tags = repr, into_u8, try_from_u8)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
#[repr(u8)]
pub enum FungibleType {
#[default]
#[display("64bit")]
Unsigned64Bit = U64.into_code(),
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct GlobalStateSchema {
pub sem_id: SemId,
pub max_items: u16,
}
impl GlobalStateSchema {
pub fn once(sem_id: SemId) -> Self {
GlobalStateSchema {
sem_id,
max_items: 1,
}
}
pub fn many(sem_id: SemId) -> Self {
GlobalStateSchema {
sem_id,
max_items: u16::MAX,
}
}
}