/home/runner/work/creditcoin/creditcoin/node/rpc/src/lib.rs
Line | Count | Source (jump to first uncovered line) |
1 | 1 | use jsonrpc_core::Result as RpcResult;use jsonrpc_core::Result as RpcResult; |
2 | | use jsonrpc_derive::rpc; |
3 | | use jsonrpc_pubsub::PubSubMetadata; |
4 | | use primitives::metrics::MiningMetrics; |
5 | | |
6 | 0 | #[rpc] |
7 | | pub trait CreditcoinApi { |
8 | | type Metadata: PubSubMetadata; |
9 | | |
10 | | #[rpc(name = "creditcoin_hashrate")] |
11 | | fn mining_stats(&self) -> RpcResult<MiningStats>; |
12 | | } |
13 | | |
14 | | pub struct CreditcoinRpc { |
15 | | mining_metrics: MiningMetrics, |
16 | | } |
17 | | |
18 | | impl CreditcoinRpc { |
19 | 1 | pub fn new(mining_metrics: MiningMetrics) -> Self { |
20 | 1 | Self { mining_metrics } |
21 | 1 | } |
22 | | } |
23 | | |
24 | | pub enum Error { |
25 | | StorageError = 1, |
26 | | DecodeError, |
27 | | SubscriptionError, |
28 | | RuntimeError, |
29 | | } |
30 | | |
31 | | impl From<Error> for i64 { |
32 | 3 | fn from(e: Error) -> i64 { |
33 | 3 | e as i64 |
34 | 3 | } |
35 | | } |
36 | | |
37 | | impl CreditcoinApi for CreditcoinRpc { |
38 | | type Metadata = sc_rpc::Metadata; |
39 | | |
40 | 1 | fn mining_stats(&self) -> RpcResult<MiningStats> { |
41 | 1 | let hash_count = self.mining_metrics.count(); |
42 | 1 | let elapsed = self.mining_metrics.elapsed(); |
43 | 1 | let rate = hash_count as f64 / elapsed.as_secs_f64(); |
44 | 1 | Ok(MiningStats { hash_count, elapsed, rate }) |
45 | 1 | } |
46 | | } |
47 | | |
48 | 2 | #[derive(Debug0 , Clone, serd0 e::Serializ0 e0 , s0 erde::Deserializ0 e0 )] |
49 | | pub struct MiningStats { |
50 | | hash_count: u64, |
51 | | elapsed: std::time::Duration, |
52 | | rate: f64, |
53 | | } |
54 | | |
55 | | mod task; |
56 | | pub use task::{Task, TaskRpc}; |
57 | | |
58 | | #[cfg(test)] |
59 | | mod test { |
60 | | use super::*; |
61 | | use assert_matches::assert_matches; |
62 | | use std::time::Duration; |
63 | | |
64 | 1 | #[test] |
65 | | #[allow(clippy::redundant_clone)] |
66 | 1 | fn metrics_work() { |
67 | 1 | let metrics = MiningMetrics::new(None).unwrap(); |
68 | 1 | let rpc = CreditcoinRpc::new(metrics); |
69 | 1 | |
70 | 1 | let result = rpc.mining_stats(); |
71 | 1 | assert_matches!0 (result.clone(), Ok(stats) => { |
72 | 1 | assert_eq!(stats.hash_count, 0); |
73 | 1 | assert!(stats.elapsed > Duration::from_secs(0)); |
74 | 1 | assert_eq!(stats.rate, 0.0); |
75 | | }); |
76 | | |
77 | | // exercise Clone trait |
78 | 1 | let stats = result.unwrap(); |
79 | 1 | let _ = stats.clone(); |
80 | 1 | } |
81 | | |
82 | 1 | #[test] |
83 | 1 | fn can_create_integer_from_error() { |
84 | 1 | assert_eq!(i64::from(Error::StorageError), 1); |
85 | 1 | assert_eq!(i64::from(Error::DecodeError), 2); |
86 | 1 | assert_eq!(i64::from(Error::SubscriptionError), 3); |
87 | 1 | } |
88 | | } |