mod.rs 6.7 KB

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