|
@@ -3,7 +3,6 @@
|
|
|
//! <https://github.com/cashubtc/nuts/blob/main/18.md>
|
|
//! <https://github.com/cashubtc/nuts/blob/main/18.md>
|
|
|
|
|
|
|
|
use std::fmt;
|
|
use std::fmt;
|
|
|
-use std::ops::Not;
|
|
|
|
|
use std::str::FromStr;
|
|
use std::str::FromStr;
|
|
|
|
|
|
|
|
use bitcoin::base64::engine::{general_purpose, GeneralPurpose};
|
|
use bitcoin::base64::engine::{general_purpose, GeneralPurpose};
|
|
@@ -40,8 +39,8 @@ pub struct PaymentRequest {
|
|
|
pub description: Option<String>,
|
|
pub description: Option<String>,
|
|
|
/// Transport
|
|
/// Transport
|
|
|
#[serde(rename = "t")]
|
|
#[serde(rename = "t")]
|
|
|
- #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
- pub transports: Option<Vec<Transport>>,
|
|
|
|
|
|
|
+ #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::default")]
|
|
|
|
|
+ pub transports: Vec<Transport>,
|
|
|
/// Nut10
|
|
/// Nut10
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub nut10: Option<Nut10SecretRequest>,
|
|
pub nut10: Option<Nut10SecretRequest>,
|
|
@@ -168,8 +167,6 @@ impl PaymentRequestBuilder {
|
|
|
|
|
|
|
|
/// Build the PaymentRequest
|
|
/// Build the PaymentRequest
|
|
|
pub fn build(self) -> PaymentRequest {
|
|
pub fn build(self) -> PaymentRequest {
|
|
|
- let transports = self.transports.is_empty().not().then_some(self.transports);
|
|
|
|
|
-
|
|
|
|
|
PaymentRequest {
|
|
PaymentRequest {
|
|
|
payment_id: self.payment_id,
|
|
payment_id: self.payment_id,
|
|
|
amount: self.amount,
|
|
amount: self.amount,
|
|
@@ -177,7 +174,7 @@ impl PaymentRequestBuilder {
|
|
|
single_use: self.single_use,
|
|
single_use: self.single_use,
|
|
|
mints: self.mints,
|
|
mints: self.mints,
|
|
|
description: self.description,
|
|
description: self.description,
|
|
|
- transports,
|
|
|
|
|
|
|
+ transports: self.transports,
|
|
|
nut10: self.nut10,
|
|
nut10: self.nut10,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -224,8 +221,7 @@ mod tests {
|
|
|
);
|
|
);
|
|
|
assert_eq!(req.unit.unwrap(), CurrencyUnit::Sat);
|
|
assert_eq!(req.unit.unwrap(), CurrencyUnit::Sat);
|
|
|
|
|
|
|
|
- let transport = req.transports.unwrap();
|
|
|
|
|
- let transport = transport.first().unwrap();
|
|
|
|
|
|
|
+ let transport = req.transports.first().unwrap();
|
|
|
|
|
|
|
|
let expected_transport = Transport {_type: TransportType::Nostr, target: "nprofile1qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsz9mhwden5te0wfjkccte9curxven9eehqctrv5hszrthwden5te0dehhxtnvdakqqgydaqy7curk439ykptkysv7udhdhu68sucm295akqefdehkf0d495cwunl5".to_string(), tags: Some(vec![vec!["n".to_string(), "17".to_string()]])};
|
|
let expected_transport = Transport {_type: TransportType::Nostr, target: "nprofile1qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsz9mhwden5te0wfjkccte9curxven9eehqctrv5hszrthwden5te0dehhxtnvdakqqgydaqy7curk439ykptkysv7udhdhu68sucm295akqefdehkf0d495cwunl5".to_string(), tags: Some(vec![vec!["n".to_string(), "17".to_string()]])};
|
|
|
|
|
|
|
@@ -245,7 +241,7 @@ mod tests {
|
|
|
.parse()
|
|
.parse()
|
|
|
.expect("valid mint url")]),
|
|
.expect("valid mint url")]),
|
|
|
description: None,
|
|
description: None,
|
|
|
- transports: Some(vec![transport.clone()]),
|
|
|
|
|
|
|
+ transports: vec![transport.clone()],
|
|
|
nut10: None,
|
|
nut10: None,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -262,8 +258,7 @@ mod tests {
|
|
|
);
|
|
);
|
|
|
assert_eq!(req.unit.unwrap(), CurrencyUnit::Sat);
|
|
assert_eq!(req.unit.unwrap(), CurrencyUnit::Sat);
|
|
|
|
|
|
|
|
- let t = req.transports.unwrap();
|
|
|
|
|
- let t = t.first().unwrap();
|
|
|
|
|
|
|
+ let t = req.transports.first().unwrap();
|
|
|
assert_eq!(&transport, t);
|
|
assert_eq!(&transport, t);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -293,8 +288,7 @@ mod tests {
|
|
|
assert_eq!(request.unit.clone().unwrap(), CurrencyUnit::Sat);
|
|
assert_eq!(request.unit.clone().unwrap(), CurrencyUnit::Sat);
|
|
|
assert_eq!(request.mints.clone().unwrap(), vec![mint_url]);
|
|
assert_eq!(request.mints.clone().unwrap(), vec![mint_url]);
|
|
|
|
|
|
|
|
- let t = request.transports.clone().unwrap();
|
|
|
|
|
- let t = t.first().unwrap();
|
|
|
|
|
|
|
+ let t = request.transports.first().clone().unwrap();
|
|
|
assert_eq!(&transport, t);
|
|
assert_eq!(&transport, t);
|
|
|
|
|
|
|
|
// Test serialization and deserialization
|
|
// Test serialization and deserialization
|
|
@@ -497,8 +491,7 @@ mod tests {
|
|
|
vec![MintUrl::from_str("https://8333.space:3338").unwrap()]
|
|
vec![MintUrl::from_str("https://8333.space:3338").unwrap()]
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- let transport = payment_request.transports.as_ref().unwrap();
|
|
|
|
|
- let transport = transport.first().unwrap();
|
|
|
|
|
|
|
+ let transport = payment_request.transports.first().unwrap();
|
|
|
assert_eq!(transport._type, TransportType::Nostr);
|
|
assert_eq!(transport._type, TransportType::Nostr);
|
|
|
assert_eq!(transport.target, "nprofile1qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsz9mhwden5te0wfjkccte9curxven9eehqctrv5hszrthwden5te0dehhxtnvdakqqgydaqy7curk439ykptkysv7udhdhu68sucm295akqefdehkf0d495cwunl5");
|
|
assert_eq!(transport.target, "nprofile1qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsz9mhwden5te0wfjkccte9curxven9eehqctrv5hszrthwden5te0dehhxtnvdakqqgydaqy7curk439ykptkysv7udhdhu68sucm295akqefdehkf0d495cwunl5");
|
|
|
assert_eq!(
|
|
assert_eq!(
|
|
@@ -562,8 +555,7 @@ mod tests {
|
|
|
]
|
|
]
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- let transport = payment_request_cloned.transports.unwrap();
|
|
|
|
|
- let transport = transport.first().unwrap();
|
|
|
|
|
|
|
+ let transport = payment_request_cloned.transports.first().unwrap();
|
|
|
assert_eq!(transport._type, TransportType::Nostr);
|
|
assert_eq!(transport._type, TransportType::Nostr);
|
|
|
assert_eq!(
|
|
assert_eq!(
|
|
|
transport.target,
|
|
transport.target,
|
|
@@ -614,7 +606,7 @@ mod tests {
|
|
|
payment_request_cloned.mints.unwrap(),
|
|
payment_request_cloned.mints.unwrap(),
|
|
|
vec![MintUrl::from_str("https://mint.example.com").unwrap()]
|
|
vec![MintUrl::from_str("https://mint.example.com").unwrap()]
|
|
|
);
|
|
);
|
|
|
- assert_eq!(payment_request_cloned.transports, None);
|
|
|
|
|
|
|
+ assert_eq!(payment_request_cloned.transports, vec![]);
|
|
|
|
|
|
|
|
// Test round-trip serialization
|
|
// Test round-trip serialization
|
|
|
let encoded = payment_request.to_string();
|
|
let encoded = payment_request.to_string();
|