use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use crate::nuts::nut00::KnownMethod;
use crate::nuts::nut05::{MeltQuoteCustomRequest, MeltQuoteCustomResponse};
use crate::nuts::nut23::{MeltQuoteBolt11Request, MeltQuoteBolt11Response};
use crate::nuts::nut25::{MeltQuoteBolt12Request, MeltQuoteBolt12Response};
use crate::{Amount, CurrencyUnit, MeltQuoteState, PaymentMethod};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MeltQuoteRequest {
Bolt11(MeltQuoteBolt11Request),
Bolt12(MeltQuoteBolt12Request),
Custom(MeltQuoteCustomRequest),
}
impl From<MeltQuoteBolt11Request> for MeltQuoteRequest {
fn from(request: MeltQuoteBolt11Request) -> Self {
MeltQuoteRequest::Bolt11(request)
}
}
impl From<MeltQuoteBolt12Request> for MeltQuoteRequest {
fn from(request: MeltQuoteBolt12Request) -> Self {
MeltQuoteRequest::Bolt12(request)
}
}
impl From<MeltQuoteCustomRequest> for MeltQuoteRequest {
fn from(request: MeltQuoteCustomRequest) -> Self {
MeltQuoteRequest::Custom(request)
}
}
impl MeltQuoteRequest {
pub fn method(&self) -> PaymentMethod {
match self {
Self::Bolt11(_) => PaymentMethod::Known(KnownMethod::Bolt11),
Self::Bolt12(_) => PaymentMethod::Known(KnownMethod::Bolt12),
Self::Custom(request) => PaymentMethod::from(request.method.as_str()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "Q: Serialize + DeserializeOwned")]
pub enum MeltQuoteResponse<Q> {
Bolt11(MeltQuoteBolt11Response<Q>),
Bolt12(MeltQuoteBolt12Response<Q>),
Custom((PaymentMethod, MeltQuoteCustomResponse<Q>)),
}
impl<Q> MeltQuoteResponse<Q> {
pub fn method(&self) -> PaymentMethod {
match self {
Self::Bolt11(_) => PaymentMethod::Known(KnownMethod::Bolt11),
Self::Bolt12(_) => PaymentMethod::Known(KnownMethod::Bolt12),
Self::Custom((method, _)) => method.clone(),
}
}
pub fn quote(&self) -> &Q {
match self {
Self::Bolt11(r) => &r.quote,
Self::Bolt12(r) => &r.quote,
Self::Custom((_, r)) => &r.quote,
}
}
pub fn amount(&self) -> Amount {
match self {
Self::Bolt11(r) => r.amount,
Self::Bolt12(r) => r.amount,
Self::Custom((_, r)) => r.amount,
}
}
pub fn fee_reserve(&self) -> Amount {
match self {
Self::Bolt11(r) => r.fee_reserve,
Self::Bolt12(r) => r.fee_reserve,
Self::Custom((_, r)) => r.fee_reserve,
}
}
pub fn state(&self) -> MeltQuoteState {
match self {
Self::Bolt11(r) => r.state,
Self::Bolt12(r) => r.state,
Self::Custom((_, r)) => r.state,
}
}
pub fn expiry(&self) -> u64 {
match self {
Self::Bolt11(r) => r.expiry,
Self::Bolt12(r) => r.expiry,
Self::Custom((_, r)) => r.expiry,
}
}
pub fn payment_preimage(&self) -> Option<&str> {
match self {
Self::Bolt11(r) => r.payment_preimage.as_deref(),
Self::Bolt12(r) => r.payment_preimage.as_deref(),
Self::Custom((_, r)) => r.payment_preimage.as_deref(),
}
}
pub fn change(&self) -> Option<&Vec<crate::BlindSignature>> {
match self {
Self::Bolt11(r) => r.change.as_ref(),
Self::Bolt12(r) => r.change.as_ref(),
Self::Custom((_, r)) => r.change.as_ref(),
}
}
pub fn request(&self) -> Option<&str> {
match self {
Self::Bolt11(r) => r.request.as_deref(),
Self::Bolt12(r) => r.request.as_deref(),
Self::Custom((_, r)) => r.request.as_deref(),
}
}
pub fn unit(&self) -> Option<CurrencyUnit> {
match self {
Self::Bolt11(r) => r.unit.clone(),
Self::Bolt12(r) => r.unit.clone(),
Self::Custom((_, r)) => r.unit.clone(),
}
}
}