use amplify::num::u24;
use strict_encoding::{DefaultBasedStrictDumb, Primitive};
use strict_types::SemId;
use crate::{StateType, LIB_NAME_RGB_COMMIT};
#[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),
}
impl OwnedStateSchema {
pub fn state_type(&self) -> StateType {
match self {
OwnedStateSchema::Declarative => StateType::Void,
OwnedStateSchema::Fungible(_) => StateType::Fungible,
OwnedStateSchema::Structured(_) => StateType::Structured,
}
}
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(),
}
impl DefaultBasedStrictDumb for FungibleType {}
#[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 sem_id: SemId,
pub max_items: u24,
}
impl GlobalStateSchema {
pub fn once(sem_id: SemId) -> Self {
GlobalStateSchema {
sem_id,
max_items: u24::ONE,
}
}
pub fn many(sem_id: SemId) -> Self {
GlobalStateSchema {
sem_id,
max_items: u24::MAX,
}
}
}