use std::fmt;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use super::nut01::PublicKey;
#[derive(Debug, Error, PartialEq, Eq)]
pub enum Error {
#[error("Unknown state")]
UnknownState,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
pub enum State {
Spent,
Unspent,
Pending,
Reserved,
}
impl fmt::Display for State {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Self::Spent => "SPENT",
Self::Unspent => "UNSPENT",
Self::Pending => "PENDING",
Self::Reserved => "RESERVED",
};
write!(f, "{}", s)
}
}
impl FromStr for State {
type Err = Error;
fn from_str(state: &str) -> Result<Self, Self::Err> {
match state {
"SPENT" => Ok(Self::Spent),
"UNSPENT" => Ok(Self::Unspent),
"PENDING" => Ok(Self::Pending),
"RESERVED" => Ok(Self::Reserved),
_ => Err(Error::UnknownState),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
pub struct CheckStateRequest {
#[serde(rename = "Ys")]
#[cfg_attr(feature = "swagger", schema(value_type = Vec<String>, max_items = 1_000))]
pub ys: Vec<PublicKey>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
pub struct ProofState {
#[serde(rename = "Y")]
#[cfg_attr(feature = "swagger", schema(value_type = String))]
pub y: PublicKey,
pub state: State,
pub witness: Option<String>,
}
impl From<(PublicKey, State)> for ProofState {
fn from(value: (PublicKey, State)) -> Self {
Self {
y: value.0,
state: value.1,
witness: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
pub struct CheckStateResponse {
pub states: Vec<ProofState>,
}