use amplify::confinement::SmallBlob;
use amplify::Wrapper;
use strict_encoding::{DefaultBasedStrictDumb, StrictType};
use super::ExposedState;
use crate::{RevealedState, StateType, LIB_NAME_RGB_COMMIT};
#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash, Display, Default)]
#[display("void")]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_COMMIT)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))]
pub struct VoidState(());
impl DefaultBasedStrictDumb for VoidState {}
impl ExposedState for VoidState {
fn state_type(&self) -> StateType { StateType::Void }
fn state_data(&self) -> RevealedState { RevealedState::Void }
}
#[derive(Wrapper, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash, From, Display, Default)]
#[display(LowerHex)]
#[wrapper(Deref, AsSlice, BorrowSlice, Hex)]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_COMMIT)]
pub struct RevealedData(SmallBlob);
impl DefaultBasedStrictDumb for RevealedData {}
impl RevealedData {
pub fn new(value: impl Into<SmallBlob>) -> Self { Self(value.into()) }
}
impl ExposedState for RevealedData {
fn state_type(&self) -> StateType { StateType::Structured }
fn state_data(&self) -> RevealedState { RevealedState::Structured(self.clone()) }
}
#[cfg(feature = "serde")]
mod _serde {
use amplify::hex::FromHex;
use serde_crate::de::Error;
use serde_crate::{Deserialize, Deserializer, Serialize, Serializer};
use super::*;
impl Serialize for RevealedData {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer {
serializer.serialize_str(&self.to_string())
}
}
impl<'de> Deserialize<'de> for RevealedData {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de> {
let s = String::deserialize(deserializer)?;
Self::from_hex(&s).map_err(D::Error::custom)
}
}
}