cdk_payment_processor/proto/
mod.rs

1//! Proto types for payment processor
2
3use std::str::FromStr;
4
5use cdk_common::payment::{
6    CreateIncomingPaymentResponse, MakePaymentResponse as CdkMakePaymentResponse,
7};
8use cdk_common::{Bolt11Invoice, CurrencyUnit, MeltQuoteBolt11Request};
9use melt_options::Options;
10mod client;
11mod server;
12
13pub use client::PaymentProcessorClient;
14pub use server::PaymentProcessorServer;
15
16tonic::include_proto!("cdk_payment_processor");
17
18impl TryFrom<MakePaymentResponse> for CdkMakePaymentResponse {
19    type Error = crate::error::Error;
20    fn try_from(value: MakePaymentResponse) -> Result<Self, Self::Error> {
21        Ok(Self {
22            payment_lookup_id: value.payment_lookup_id.clone(),
23            payment_proof: value.payment_proof.clone(),
24            status: value.status().as_str_name().parse()?,
25            total_spent: value.total_spent.into(),
26            unit: value.unit.parse()?,
27        })
28    }
29}
30
31impl From<CdkMakePaymentResponse> for MakePaymentResponse {
32    fn from(value: CdkMakePaymentResponse) -> Self {
33        Self {
34            payment_lookup_id: value.payment_lookup_id.clone(),
35            payment_proof: value.payment_proof.clone(),
36            status: QuoteState::from(value.status).into(),
37            total_spent: value.total_spent.into(),
38            unit: value.unit.to_string(),
39        }
40    }
41}
42
43impl From<CreateIncomingPaymentResponse> for CreatePaymentResponse {
44    fn from(value: CreateIncomingPaymentResponse) -> Self {
45        Self {
46            request_lookup_id: value.request_lookup_id,
47            request: value.request.to_string(),
48            expiry: value.expiry,
49        }
50    }
51}
52
53impl TryFrom<CreatePaymentResponse> for CreateIncomingPaymentResponse {
54    type Error = crate::error::Error;
55
56    fn try_from(value: CreatePaymentResponse) -> Result<Self, Self::Error> {
57        Ok(Self {
58            request_lookup_id: value.request_lookup_id,
59            request: value.request,
60            expiry: value.expiry,
61        })
62    }
63}
64
65impl From<&MeltQuoteBolt11Request> for PaymentQuoteRequest {
66    fn from(value: &MeltQuoteBolt11Request) -> Self {
67        Self {
68            request: value.request.to_string(),
69            unit: value.unit.to_string(),
70            options: value.options.map(|o| o.into()),
71        }
72    }
73}
74
75impl From<cdk_common::payment::PaymentQuoteResponse> for PaymentQuoteResponse {
76    fn from(value: cdk_common::payment::PaymentQuoteResponse) -> Self {
77        Self {
78            request_lookup_id: value.request_lookup_id,
79            amount: value.amount.into(),
80            fee: value.fee.into(),
81            state: QuoteState::from(value.state).into(),
82            unit: value.unit.to_string(),
83        }
84    }
85}
86
87impl From<cdk_common::nut23::MeltOptions> for MeltOptions {
88    fn from(value: cdk_common::nut23::MeltOptions) -> Self {
89        Self {
90            options: Some(value.into()),
91        }
92    }
93}
94
95impl From<cdk_common::nut23::MeltOptions> for Options {
96    fn from(value: cdk_common::nut23::MeltOptions) -> Self {
97        match value {
98            cdk_common::MeltOptions::Mpp { mpp } => Self::Mpp(Mpp {
99                amount: mpp.amount.into(),
100            }),
101            cdk_common::MeltOptions::Amountless { amountless } => Self::Amountless(Amountless {
102                amount_msat: amountless.amount_msat.into(),
103            }),
104        }
105    }
106}
107
108impl From<MeltOptions> for cdk_common::nut23::MeltOptions {
109    fn from(value: MeltOptions) -> Self {
110        let options = value.options.expect("option defined");
111        match options {
112            Options::Mpp(mpp) => cdk_common::MeltOptions::new_mpp(mpp.amount),
113            Options::Amountless(amountless) => {
114                cdk_common::MeltOptions::new_amountless(amountless.amount_msat)
115            }
116        }
117    }
118}
119
120impl From<PaymentQuoteResponse> for cdk_common::payment::PaymentQuoteResponse {
121    fn from(value: PaymentQuoteResponse) -> Self {
122        Self {
123            request_lookup_id: value.request_lookup_id.clone(),
124            amount: value.amount.into(),
125            unit: CurrencyUnit::from_str(&value.unit).unwrap_or_default(),
126            fee: value.fee.into(),
127            state: value.state().into(),
128        }
129    }
130}
131
132impl From<QuoteState> for cdk_common::nut05::QuoteState {
133    fn from(value: QuoteState) -> Self {
134        match value {
135            QuoteState::Unpaid => Self::Unpaid,
136            QuoteState::Paid => Self::Paid,
137            QuoteState::Pending => Self::Pending,
138            QuoteState::Unknown => Self::Unknown,
139            QuoteState::Failed => Self::Failed,
140            QuoteState::Issued => Self::Unknown,
141        }
142    }
143}
144
145impl From<cdk_common::nut05::QuoteState> for QuoteState {
146    fn from(value: cdk_common::nut05::QuoteState) -> Self {
147        match value {
148            cdk_common::MeltQuoteState::Unpaid => Self::Unpaid,
149            cdk_common::MeltQuoteState::Paid => Self::Paid,
150            cdk_common::MeltQuoteState::Pending => Self::Pending,
151            cdk_common::MeltQuoteState::Unknown => Self::Unknown,
152            cdk_common::MeltQuoteState::Failed => Self::Failed,
153        }
154    }
155}
156
157impl From<cdk_common::nut23::QuoteState> for QuoteState {
158    fn from(value: cdk_common::nut23::QuoteState) -> Self {
159        match value {
160            cdk_common::MintQuoteState::Unpaid => Self::Unpaid,
161            cdk_common::MintQuoteState::Paid => Self::Paid,
162            cdk_common::MintQuoteState::Pending => Self::Pending,
163            cdk_common::MintQuoteState::Issued => Self::Issued,
164        }
165    }
166}
167
168impl From<cdk_common::mint::MeltQuote> for MeltQuote {
169    fn from(value: cdk_common::mint::MeltQuote) -> Self {
170        Self {
171            id: value.id.to_string(),
172            unit: value.unit.to_string(),
173            amount: value.amount.into(),
174            request: value.request,
175            fee_reserve: value.fee_reserve.into(),
176            state: QuoteState::from(value.state).into(),
177            expiry: value.expiry,
178            payment_preimage: value.payment_preimage,
179            request_lookup_id: value.request_lookup_id,
180            msat_to_pay: value.msat_to_pay.map(|a| a.into()),
181            created_time: value.created_time,
182            paid_time: value.paid_time,
183        }
184    }
185}
186
187impl TryFrom<MeltQuote> for cdk_common::mint::MeltQuote {
188    type Error = crate::error::Error;
189
190    fn try_from(value: MeltQuote) -> Result<Self, Self::Error> {
191        Ok(Self {
192            id: value
193                .id
194                .parse()
195                .map_err(|_| crate::error::Error::InvalidId)?,
196            unit: value.unit.parse()?,
197            amount: value.amount.into(),
198            request: value.request.clone(),
199            fee_reserve: value.fee_reserve.into(),
200            state: cdk_common::nut05::QuoteState::from(value.state()),
201            expiry: value.expiry,
202            payment_preimage: value.payment_preimage,
203            request_lookup_id: value.request_lookup_id,
204            msat_to_pay: value.msat_to_pay.map(|a| a.into()),
205            created_time: value.created_time,
206            paid_time: value.paid_time,
207        })
208    }
209}
210
211impl TryFrom<PaymentQuoteRequest> for MeltQuoteBolt11Request {
212    type Error = crate::error::Error;
213
214    fn try_from(value: PaymentQuoteRequest) -> Result<Self, Self::Error> {
215        Ok(Self {
216            request: Bolt11Invoice::from_str(&value.request)?,
217            unit: CurrencyUnit::from_str(&value.unit)?,
218            options: value.options.map(|o| o.into()),
219        })
220    }
221}