use amplify::confinement::{SmallBlob, 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 media_kit: TinyString,
pub global_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
pub owned_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
pub extensions: TinyOrdMap<u16, SmallBlob>,
}
#[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 velocity: VelocityHint,
}
#[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 VelocityHint {
#[default]
Unspecified = 0,
Seldom = 15,
Episodic = 31,
Regular = 63,
Frequent = 127,
HighFrequency = 255,
}
impl VelocityHint {
pub fn with_value(value: &u8) -> Self {
match *value {
0 => VelocityHint::Unspecified,
1..=15 => VelocityHint::Seldom,
16..=31 => VelocityHint::Episodic,
32..=63 => VelocityHint::Regular,
64..=127 => VelocityHint::Frequent,
128..=255 => VelocityHint::HighFrequency,
}
}
}