use amplify::num::u24;
use commit_verify::ReservedBytes;
use strict_encoding::Primitive;
use strict_types::SemId;
use crate::{StateType, LIB_NAME_RGB_COMMIT};
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase", tag = "type")
)]
#[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_COMMIT, tags = order)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub enum OwnedStateSchema {
#[strict_type(dumb)]
Declarative,
Fungible(FungibleType),
Structured(SemId),
Attachment(MediaType),
}
impl OwnedStateSchema {
pub fn state_type(&self) -> StateType {
match self {
OwnedStateSchema::Declarative => StateType::Void,
OwnedStateSchema::Fungible(_) => StateType::Fungible,
OwnedStateSchema::Structured(_) => StateType::Structured,
OwnedStateSchema::Attachment(_) => StateType::Attachment,
}
}
pub fn sem_id(&self) -> Option<SemId> {
if let Self::Structured(id) = self { Some(*id) } else { None }
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Display)]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_COMMIT, 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 = Primitive::U64.into_code(),
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_COMMIT)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct GlobalStateSchema {
pub reserved: ReservedBytes<1>,
pub sem_id: SemId,
pub max_items: u24,
}
impl GlobalStateSchema {
pub fn once(sem_id: SemId) -> Self {
GlobalStateSchema {
reserved: default!(),
sem_id,
max_items: u24::ONE,
}
}
pub fn many(sem_id: SemId) -> Self {
GlobalStateSchema {
reserved: default!(),
sem_id,
max_items: u24::MAX,
}
}
}