Skip to content

Commit 7a59cff

Browse files
committed
Avoid concrete rust-bitcoin type in hidden module
A concrete rust-bitcoin type was added to the version-specific `GetOrphanTxs` struct during #435. This is corrected by using a list of strings and converting to the model type via `into_model`. Affects v29 and v30. Also, use the explicit error in the itegration tests to check that the re-exports are good. Fixes #484
1 parent 61d1294 commit 7a59cff

9 files changed

Lines changed: 90 additions & 20 deletions

File tree

integration_test/tests/hidden.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,14 @@ fn hidden__get_orphan_txs__modelled() {
148148
let json_v1: GetOrphanTxsVerboseOne = node2.client.get_orphan_txs_verbosity_1().expect("getorphantxs 1");
149149
let json_v2: GetOrphanTxsVerboseTwo = node2.client.get_orphan_txs_verbosity_2().expect("getorphantxs 2");
150150

151-
let model_v0: mtype::GetOrphanTxs = json_v0.into_model();
152-
let model_v1: mtype::GetOrphanTxsVerboseOne = json_v1.into_model().unwrap();
153-
let model_v2: mtype::GetOrphanTxsVerboseTwo = json_v2.into_model().unwrap();
154-
151+
// use explicit errors here to check that the re-exports are good
152+
let model_v0: Result<mtype::GetOrphanTxs, GetOrphanTxsError> = json_v0.into_model();
153+
let model_v1: Result<mtype::GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntryError> = json_v1.into_model();
154+
let model_v2: Result<mtype::GetOrphanTxsVerboseTwo, GetOrphanTxsVerboseTwoEntryError> = json_v2.into_model();
155+
156+
let model_v0 = model_v0.unwrap();
157+
let model_v1 = model_v1.unwrap();
158+
let model_v2 = model_v2.unwrap();
155159

156160
assert_eq!(model_v0.0.len(), NUM_ORPHANS as usize);
157161
assert_eq!(model_v1.0.len(), NUM_ORPHANS as usize);

types/src/v29/hidden/error.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,30 @@ use bitcoin::hex;
77

88
use crate::error::write_err;
99

10+
/// Error when converting a `GetOrphanTxs` type into the model type.
11+
#[derive(Debug)]
12+
pub enum GetOrphanTxsError {
13+
/// Conversion of a `txid` from the orphanage failed.
14+
Txid(hex::HexToArrayError),
15+
}
16+
17+
impl fmt::Display for GetOrphanTxsError {
18+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19+
match *self {
20+
Self::Txid(ref e) => write_err!(f, "conversion of the `txid` field failed"; e),
21+
}
22+
}
23+
}
24+
25+
#[cfg(feature = "std")]
26+
impl std::error::Error for GetOrphanTxsError {
27+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
28+
match *self {
29+
Self::Txid(ref e) => Some(e),
30+
}
31+
}
32+
}
33+
1034
/// Error when converting a `GetOrphanTxsVerboseOneEntry` type into the model type.
1135
#[derive(Debug)]
1236
pub enum GetOrphanTxsVerboseOneEntryError {
@@ -54,8 +78,9 @@ impl fmt::Display for GetOrphanTxsVerboseTwoEntryError {
5478
Self::Txid(ref e) => write_err!(f, "conversion of the `txid` field failed"; e),
5579
Self::Wtxid(ref e) => write_err!(f, "conversion of the `wtxid` field failed"; e),
5680
Self::Hex(ref e) => write_err!(f, "conversion of hex data to bytes failed"; e),
57-
Self::Consensus(ref e) =>
58-
write_err!(f, "consensus decoding of `hex` to transaction failed"; e),
81+
Self::Consensus(ref e) => {
82+
write_err!(f, "consensus decoding of `hex` to transaction failed"; e)
83+
}
5984
}
6085
}
6186
}

types/src/v29/hidden/into.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@ use bitcoin::hashes::hex::FromHex;
55
use bitcoin::{Transaction, Txid, Wtxid};
66

77
use super::{
8-
GetOrphanTxs, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
8+
GetOrphanTxs, GetOrphanTxsError, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
99
GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwo, GetOrphanTxsVerboseTwoEntry,
1010
GetOrphanTxsVerboseTwoEntryError,
1111
};
1212
use crate::model;
1313

1414
impl GetOrphanTxs {
1515
/// Converts version specific type to a version nonspecific, more strongly typed type.
16-
pub fn into_model(self) -> model::GetOrphanTxs { model::GetOrphanTxs(self.0) }
16+
pub fn into_model(self) -> Result<model::GetOrphanTxs, GetOrphanTxsError> {
17+
use GetOrphanTxsError as E;
18+
19+
let txids: Result<Vec<Txid>, E> =
20+
self.0.into_iter().map(|s| s.parse::<Txid>().map_err(E::Txid)).collect();
21+
22+
Ok(model::GetOrphanTxs(txids?))
23+
}
1724
}
1825

1926
impl GetOrphanTxsVerboseOneEntry {

types/src/v29/hidden/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
mod error;
88
mod into;
99

10-
use bitcoin::Txid;
1110
use serde::{Deserialize, Serialize};
1211

13-
pub use self::error::{GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEntryError};
12+
pub use self::error::{
13+
GetOrphanTxsError, GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEntryError,
14+
};
1415

1516
/// Result of JSON-RPC method `getorphantxs` verbosity 0.
1617
///
@@ -19,7 +20,7 @@ pub use self::error::{GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEn
1920
/// > Shows transactions in the tx orphanage.
2021
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
2122
#[cfg_attr(feature = "serde-deny-unknown-fields", serde(deny_unknown_fields))]
22-
pub struct GetOrphanTxs(pub Vec<Txid>);
23+
pub struct GetOrphanTxs(pub Vec<String>);
2324

2425
/// Result of JSON-RPC method `getorphantxs` verbosity 1.
2526
///

types/src/v29/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ pub use self::{
270270
SpendActivity,
271271
},
272272
hidden::{
273-
GetOrphanTxs, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
273+
GetOrphanTxs, GetOrphanTxsError, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
274274
GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwo, GetOrphanTxsVerboseTwoEntry,
275275
GetOrphanTxsVerboseTwoEntryError,
276276
},

types/src/v30/hidden/error.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,30 @@ use bitcoin::hex;
77

88
use crate::error::write_err;
99

10+
/// Error when converting a `GetOrphanTxs` type into the model type.
11+
#[derive(Debug)]
12+
pub enum GetOrphanTxsError {
13+
/// Conversion of the transaction `txid` field failed.
14+
Txid(hex::HexToArrayError),
15+
}
16+
17+
impl fmt::Display for GetOrphanTxsError {
18+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19+
match *self {
20+
Self::Txid(ref e) => write_err!(f, "conversion of the `txid` field failed"; e),
21+
}
22+
}
23+
}
24+
25+
#[cfg(feature = "std")]
26+
impl std::error::Error for GetOrphanTxsError {
27+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
28+
match *self {
29+
Self::Txid(ref e) => Some(e),
30+
}
31+
}
32+
}
33+
1034
/// Error when converting a `GetOrphanTxsVerboseOneEntry` type into the model type.
1135
#[derive(Debug)]
1236
pub enum GetOrphanTxsVerboseOneEntryError {
@@ -54,8 +78,9 @@ impl fmt::Display for GetOrphanTxsVerboseTwoEntryError {
5478
Self::Txid(ref e) => write_err!(f, "conversion of the `txid` field failed"; e),
5579
Self::Wtxid(ref e) => write_err!(f, "conversion of the `wtxid` field failed"; e),
5680
Self::Hex(ref e) => write_err!(f, "conversion of hex data to bytes failed"; e),
57-
Self::Consensus(ref e) =>
58-
write_err!(f, "consensus decoding of `hex` to transaction failed"; e),
81+
Self::Consensus(ref e) => {
82+
write_err!(f, "consensus decoding of `hex` to transaction failed"; e)
83+
}
5984
}
6085
}
6186
}

types/src/v30/hidden/into.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@ use bitcoin::hashes::hex::FromHex;
55
use bitcoin::{Transaction, Txid, Wtxid};
66

77
use super::{
8-
GetOrphanTxs, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
8+
GetOrphanTxs, GetOrphanTxsError, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
99
GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwo, GetOrphanTxsVerboseTwoEntry,
1010
GetOrphanTxsVerboseTwoEntryError,
1111
};
1212
use crate::model;
1313

1414
impl GetOrphanTxs {
1515
/// Converts version specific type to a version nonspecific, more strongly typed type.
16-
pub fn into_model(self) -> model::GetOrphanTxs { model::GetOrphanTxs(self.0) }
16+
pub fn into_model(self) -> Result<model::GetOrphanTxs, GetOrphanTxsError> {
17+
use GetOrphanTxsError as E;
18+
19+
let txids: Result<Vec<Txid>, E> =
20+
self.0.into_iter().map(|s| s.parse::<Txid>().map_err(E::Txid)).collect();
21+
22+
Ok(model::GetOrphanTxs(txids?))
23+
}
1724
}
1825

1926
impl GetOrphanTxsVerboseOneEntry {

types/src/v30/hidden/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
mod error;
88
mod into;
99

10-
use bitcoin::Txid;
1110
use serde::{Deserialize, Serialize};
1211

13-
pub use self::error::{GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEntryError};
12+
pub use self::error::{
13+
GetOrphanTxsError, GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEntryError,
14+
};
1415

1516
/// Result of JSON-RPC method `getorphantxs` verbosity 0.
1617
///
@@ -19,7 +20,7 @@ pub use self::error::{GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwoEn
1920
/// > Shows transactions in the tx orphanage.
2021
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
2122
#[cfg_attr(feature = "serde-deny-unknown-fields", serde(deny_unknown_fields))]
22-
pub struct GetOrphanTxs(pub Vec<Txid>);
23+
pub struct GetOrphanTxs(pub Vec<String>);
2324

2425
/// Result of JSON-RPC method `getorphantxs` verbosity 1.
2526
///

types/src/v30/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ mod wallet;
252252
pub use self::{
253253
blockchain::GetMempoolInfo,
254254
hidden::{
255-
GetOrphanTxs, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
255+
GetOrphanTxs, GetOrphanTxsError, GetOrphanTxsVerboseOne, GetOrphanTxsVerboseOneEntry,
256256
GetOrphanTxsVerboseOneEntryError, GetOrphanTxsVerboseTwo, GetOrphanTxsVerboseTwoEntry,
257257
GetOrphanTxsVerboseTwoEntryError,
258258
},

0 commit comments

Comments
 (0)