use amplify::confinement::{TinyOrdMap, TinyString};
use amplify::Bytes32;
use rgb::{AssignmentType, ContractId, GlobalStateType};
use strict_types::value;
use crate::LIB_NAME_RGB_STD;
#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)]
#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", transparent)
)]
pub struct SupplId(
#[from]
#[from([u8; 32])]
Bytes32,
);
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct ContractSuppl {
pub contract_id: ContractId,
pub ticker: TickerSuppl,
pub global_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
pub owned_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
}
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub enum TickerSuppl {
#[strict_type(tag = 0, dumb)]
Absent,
#[strict_type(tag = 1)]
Global(GlobalStateType, value::Path),
#[strict_type(tag = 2)]
Owned(AssignmentType, value::Path),
}
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct OwnedStateSuppl {
pub meaning: TinyString,
pub app_index: AppDeriveIndex,
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display, Default)]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD, tags = repr, try_from_u8, into_u8)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
#[display(lowercase)]
#[repr(u8)]
pub enum AppDeriveIndex {
#[default]
Any = 1,
HighFrequency = 10,
Frequent = 20,
Regular = 30,
Episodic = 40,
Seldom = 50,
}