1use std::fmt;
6use std::str::FromStr;
7
8use serde::{Deserialize, Serialize};
9use thiserror::Error;
10
11use super::nut01::PublicKey;
12use super::Witness;
13
14#[derive(Debug, Error, PartialEq, Eq)]
16pub enum Error {
17 #[error("Unknown state")]
19 UnknownState,
20}
21
22#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
24#[serde(rename_all = "UPPERCASE")]
25pub enum State {
26 Spent,
28 Unspent,
30 Pending,
34 Reserved,
38 PendingSpent,
40}
41
42impl fmt::Display for State {
43 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44 let s = match self {
45 Self::Spent => "SPENT",
46 Self::Unspent => "UNSPENT",
47 Self::Pending => "PENDING",
48 Self::Reserved => "RESERVED",
49 Self::PendingSpent => "PENDING_SPENT",
50 };
51
52 write!(f, "{s}")
53 }
54}
55
56impl FromStr for State {
57 type Err = Error;
58
59 fn from_str(state: &str) -> Result<Self, Self::Err> {
60 match state {
61 "SPENT" => Ok(Self::Spent),
62 "UNSPENT" => Ok(Self::Unspent),
63 "PENDING" => Ok(Self::Pending),
64 "RESERVED" => Ok(Self::Reserved),
65 "PENDING_SPENT" => Ok(Self::PendingSpent),
66 _ => Err(Error::UnknownState),
67 }
68 }
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73pub struct CheckStateRequest {
74 #[serde(rename = "Ys")]
76 pub ys: Vec<PublicKey>,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81pub struct ProofState {
82 #[serde(rename = "Y")]
84 pub y: PublicKey,
85 pub state: State,
87 pub witness: Option<Witness>,
89}
90
91impl From<(PublicKey, State)> for ProofState {
92 fn from(value: (PublicKey, State)) -> Self {
93 Self {
94 y: value.0,
95 state: value.1,
96 witness: None,
97 }
98 }
99}
100
101#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
103pub struct CheckStateResponse {
104 pub states: Vec<ProofState>,
106}