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        }
83    }
84}
85
86impl From<cdk_common::nut05::MeltOptions> for MeltOptions {
87    fn from(value: cdk_common::nut05::MeltOptions) -> Self {
88        Self {
89            options: Some(value.into()),
90        }
91    }
92}
93
94impl From<cdk_common::nut05::MeltOptions> for Options {
95    fn from(value: cdk_common::nut05::MeltOptions) -> Self {
96        match value {
97            cdk_common::MeltOptions::Mpp { mpp } => Self::Mpp(Mpp {
98                amount: mpp.amount.into(),
99            }),
100            cdk_common::MeltOptions::Amountless { amountless } => Self::Amountless(Amountless {
101                amount_msat: amountless.amount_msat.into(),
102            }),
103        }
104    }
105}
106
107impl From<MeltOptions> for cdk_common::nut05::MeltOptions {
108    fn from(value: MeltOptions) -> Self {
109        let options = value.options.expect("option defined");
110        match options {
111            Options::Mpp(mpp) => cdk_common::MeltOptions::new_mpp(mpp.amount),
112            Options::Amountless(amountless) => {
113                cdk_common::MeltOptions::new_amountless(amountless.amount_msat)
114            }
115        }
116    }
117}
118
119impl From<PaymentQuoteResponse> for cdk_common::payment::PaymentQuoteResponse {
120    fn from(value: PaymentQuoteResponse) -> Self {
121        Self {
122            request_lookup_id: value.request_lookup_id.clone(),
123            amount: value.amount.into(),
124            fee: value.fee.into(),
125            state: value.state().into(),
126        }
127    }
128}
129
130impl From<QuoteState> for cdk_common::nut05::QuoteState {
131    fn from(value: QuoteState) -> Self {
132        match value {
133            QuoteState::Unpaid => Self::Unpaid,
134            QuoteState::Paid => Self::Paid,
135            QuoteState::Pending => Self::Pending,
136            QuoteState::Unknown => Self::Unknown,
137            QuoteState::Failed => Self::Failed,
138            QuoteState::Issued => Self::Unknown,
139        }
140    }
141}
142
143impl From<cdk_common::nut05::QuoteState> for QuoteState {
144    fn from(value: cdk_common::nut05::QuoteState) -> Self {
145        match value {
146            cdk_common::MeltQuoteState::Unpaid => Self::Unpaid,
147            cdk_common::MeltQuoteState::Paid => Self::Paid,
148            cdk_common::MeltQuoteState::Pending => Self::Pending,
149            cdk_common::MeltQuoteState::Unknown => Self::Unknown,
150            cdk_common::MeltQuoteState::Failed => Self::Failed,
151        }
152    }
153}
154
155impl From<cdk_common::nut04::QuoteState> for QuoteState {
156    fn from(value: cdk_common::nut04::QuoteState) -> Self {
157        match value {
158            cdk_common::MintQuoteState::Unpaid => Self::Unpaid,
159            cdk_common::MintQuoteState::Paid => Self::Paid,
160            cdk_common::MintQuoteState::Pending => Self::Pending,
161            cdk_common::MintQuoteState::Issued => Self::Issued,
162        }
163    }
164}
165
166impl From<cdk_common::mint::MeltQuote> for MeltQuote {
167    fn from(value: cdk_common::mint::MeltQuote) -> Self {
168        Self {
169            id: value.id.to_string(),
170            unit: value.unit.to_string(),
171            amount: value.amount.into(),
172            request: value.request,
173            fee_reserve: value.fee_reserve.into(),
174            state: QuoteState::from(value.state).into(),
175            expiry: value.expiry,
176            payment_preimage: value.payment_preimage,
177            request_lookup_id: value.request_lookup_id,
178            msat_to_pay: value.msat_to_pay.map(|a| a.into()),
179            created_time: value.created_time,
180            paid_time: value.paid_time,
181        }
182    }
183}
184
185impl TryFrom<MeltQuote> for cdk_common::mint::MeltQuote {
186    type Error = crate::error::Error;
187
188    fn try_from(value: MeltQuote) -> Result<Self, Self::Error> {
189        Ok(Self {
190            id: value
191                .id
192                .parse()
193                .map_err(|_| crate::error::Error::InvalidId)?,
194            unit: value.unit.parse()?,
195            amount: value.amount.into(),
196            request: value.request.clone(),
197            fee_reserve: value.fee_reserve.into(),
198            state: cdk_common::nut05::QuoteState::from(value.state()),
199            expiry: value.expiry,
200            payment_preimage: value.payment_preimage,
201            request_lookup_id: value.request_lookup_id,
202            msat_to_pay: value.msat_to_pay.map(|a| a.into()),
203            created_time: value.created_time,
204            paid_time: value.paid_time,
205        })
206    }
207}
208
209impl TryFrom<PaymentQuoteRequest> for MeltQuoteBolt11Request {
210    type Error = crate::error::Error;
211
212    fn try_from(value: PaymentQuoteRequest) -> Result<Self, Self::Error> {
213        Ok(Self {
214            request: Bolt11Invoice::from_str(&value.request)?,
215            unit: CurrencyUnit::from_str(&value.unit)?,
216            options: value.options.map(|o| o.into()),
217        })
218    }
219}