Next draft. Features: connectpeer, listchannels, sendpayment, autoreconnect to chan...
[ldk-sample] / src / convert.rs
1 use bitcoin::BlockHash;
2 use bitcoin::hashes::hex::FromHex;
3 use lightning_block_sync::http::JsonResponse;
4 use std::convert::TryInto;
5
6 pub struct FundedTx {
7     pub changepos: i64,
8     pub hex: String,
9 }
10
11 impl TryInto<FundedTx> for JsonResponse {
12     type Error = std::io::Error;
13     fn try_into(self) -> std::io::Result<FundedTx> {
14         Ok(FundedTx {
15             changepos: self.0["changepos"].as_i64().unwrap(),
16             hex: self.0["hex"].as_str().unwrap().to_string(),
17         })
18     }
19 }
20
21 pub struct RawTx(pub String);
22
23 impl TryInto<RawTx> for JsonResponse {
24     type Error = std::io::Error;
25     fn try_into(self) -> std::io::Result<RawTx> {
26         Ok(RawTx(self.0.as_str().unwrap().to_string()))
27     }
28 }
29
30 pub struct SignedTx {
31     pub complete: bool,
32     pub hex: String,
33 }
34
35 impl TryInto<SignedTx> for JsonResponse {
36     type Error = std::io::Error;
37     fn try_into(self) -> std::io::Result<SignedTx> {
38         Ok(SignedTx {
39             hex: self.0["hex"].as_str().unwrap().to_string(),
40             complete: self.0["complete"].as_bool().unwrap(),
41         })
42     }
43 }
44
45 pub struct NewAddress(pub String);
46 impl TryInto<NewAddress> for JsonResponse {
47     type Error = std::io::Error;
48     fn try_into(self) -> std::io::Result<NewAddress> {
49         Ok(NewAddress(self.0.as_str().unwrap().to_string()))
50     }
51 }
52
53 pub struct FeeResponse {
54     pub feerate: Option<u32>,
55     pub errored: bool,
56 }
57
58 impl TryInto<FeeResponse> for JsonResponse {
59     type Error = std::io::Error;
60     fn try_into(self) -> std::io::Result<FeeResponse> {
61         let errored = !self.0["errors"].is_null();
62         Ok(FeeResponse {
63             errored,
64             feerate: match errored {
65                 true => None,
66                 // The feerate from bitcoind is in BTC/kb, and we want satoshis/kb.
67                 false => Some((self.0["feerate"].as_f64().unwrap() * 100_000_000.0).round() as u32)
68             }
69         })
70     }
71 }
72
73 pub struct BlockchainInfo {
74     pub latest_height: usize,
75     pub latest_blockhash: BlockHash,
76 }
77
78 impl TryInto<BlockchainInfo> for JsonResponse {
79     type Error = std::io::Error;
80     fn try_into(self) -> std::io::Result<BlockchainInfo> {
81         Ok(BlockchainInfo {
82             latest_height: self.0["blocks"].as_u64().unwrap() as usize,
83             latest_blockhash: BlockHash::from_hex(self.0["bestblockhash"].as_str().unwrap()).unwrap(),
84         })
85     }
86 }