cdk_payment_processor/proto/
mod.rs

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