Initial refactor to add tokio::main and be fully async
[ldk-sample] / src / convert.rs
1 use bitcoin::hashes::hex::FromHex;
2 use bitcoin::BlockHash;
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 errors: Array<String>,
56         pub errored: bool,
57 }
58
59 impl TryInto<FeeResponse> for JsonResponse {
60         type Error = std::io::Error;
61         fn try_into(self) -> std::io::Result<FeeResponse> {
62                 let errored = !self.0["errors"].is_null();
63                 Ok(FeeResponse {
64                         errored,
65                           feerate: match self.0["feerate"].as_f64() {
66             Some(fee) => Some((fee * 100_000_000.0).round() as u32),
67             None => None
68         }
69                                 // true => None,
70                                 // // The feerate from bitcoind is in BTC/kb, and we want satoshis/kb.
71                                 // false => Some((self.0["feerate"].as_f64().unwrap() * 100_000_000.0).round() as u32),
72                 })
73         }
74 }
75
76 pub struct BlockchainInfo {
77         pub latest_height: usize,
78         pub latest_blockhash: BlockHash,
79 }
80
81 impl TryInto<BlockchainInfo> for JsonResponse {
82         type Error = std::io::Error;
83         fn try_into(self) -> std::io::Result<BlockchainInfo> {
84                 Ok(BlockchainInfo {
85                         latest_height: self.0["blocks"].as_u64().unwrap() as usize,
86                         latest_blockhash: BlockHash::from_hex(self.0["bestblockhash"].as_str().unwrap())
87                                 .unwrap(),
88                 })
89         }
90 }