|
@@ -5,8 +5,7 @@
|
|
|
use std::fmt;
|
|
|
use std::str::FromStr;
|
|
|
|
|
|
-use serde::{Deserialize, Deserializer, Serialize};
|
|
|
-use serde_json::Value;
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
use thiserror::Error;
|
|
|
|
|
|
use super::nut00::{BlindSignature, BlindedMessage, CurrencyUnit, PaymentMethod};
|
|
@@ -80,96 +79,25 @@ impl FromStr for QuoteState {
|
|
|
}
|
|
|
|
|
|
/// Mint quote response [NUT-04]
|
|
|
-#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
|
|
|
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
|
|
|
pub struct MintQuoteBolt11Response {
|
|
|
/// Quote Id
|
|
|
pub quote: String,
|
|
|
/// Payment request to fulfil
|
|
|
pub request: String,
|
|
|
- // TODO: To be deprecated
|
|
|
- /// Whether the the request haas be paid
|
|
|
- /// Deprecated
|
|
|
- pub paid: Option<bool>,
|
|
|
/// Quote State
|
|
|
pub state: MintQuoteState,
|
|
|
/// Unix timestamp until the quote is valid
|
|
|
pub expiry: Option<u64>,
|
|
|
}
|
|
|
|
|
|
-// A custom deserializer is needed until all mints
|
|
|
-// update some will return without the required state.
|
|
|
-impl<'de> Deserialize<'de> for MintQuoteBolt11Response {
|
|
|
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
|
- where
|
|
|
- D: Deserializer<'de>,
|
|
|
- {
|
|
|
- let value = Value::deserialize(deserializer)?;
|
|
|
-
|
|
|
- let quote: String = serde_json::from_value(
|
|
|
- value
|
|
|
- .get("quote")
|
|
|
- .ok_or(serde::de::Error::missing_field("quote"))?
|
|
|
- .clone(),
|
|
|
- )
|
|
|
- .map_err(|_| serde::de::Error::custom("Invalid quote id string"))?;
|
|
|
-
|
|
|
- let request: String = serde_json::from_value(
|
|
|
- value
|
|
|
- .get("request")
|
|
|
- .ok_or(serde::de::Error::missing_field("request"))?
|
|
|
- .clone(),
|
|
|
- )
|
|
|
- .map_err(|_| serde::de::Error::custom("Invalid request string"))?;
|
|
|
-
|
|
|
- let paid: Option<bool> = value.get("paid").and_then(|p| p.as_bool());
|
|
|
-
|
|
|
- let state: Option<String> = value
|
|
|
- .get("state")
|
|
|
- .and_then(|s| serde_json::from_value(s.clone()).ok());
|
|
|
-
|
|
|
- let (state, paid) = match (state, paid) {
|
|
|
- (None, None) => return Err(serde::de::Error::custom("State or paid must be defined")),
|
|
|
- (Some(state), _) => {
|
|
|
- let state: QuoteState = QuoteState::from_str(&state)
|
|
|
- .map_err(|_| serde::de::Error::custom("Unknown state"))?;
|
|
|
- let paid = state == QuoteState::Paid;
|
|
|
-
|
|
|
- (state, paid)
|
|
|
- }
|
|
|
- (None, Some(paid)) => {
|
|
|
- let state = if paid {
|
|
|
- QuoteState::Paid
|
|
|
- } else {
|
|
|
- QuoteState::Unpaid
|
|
|
- };
|
|
|
- (state, paid)
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- let expiry = value
|
|
|
- .get("expiry")
|
|
|
- .ok_or(serde::de::Error::missing_field("expiry"))?
|
|
|
- .as_u64();
|
|
|
-
|
|
|
- Ok(Self {
|
|
|
- quote,
|
|
|
- request,
|
|
|
- paid: Some(paid),
|
|
|
- state,
|
|
|
- expiry,
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
#[cfg(feature = "mint")]
|
|
|
impl From<crate::mint::MintQuote> for MintQuoteBolt11Response {
|
|
|
fn from(mint_quote: crate::mint::MintQuote) -> MintQuoteBolt11Response {
|
|
|
- let paid = mint_quote.state == QuoteState::Paid;
|
|
|
MintQuoteBolt11Response {
|
|
|
quote: mint_quote.id,
|
|
|
request: mint_quote.request,
|
|
|
- paid: Some(paid),
|
|
|
state: mint_quote.state,
|
|
|
expiry: Some(mint_quote.expiry),
|
|
|
}
|