1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//! Implement `set.miner.power_mode` command
//!
//! Sets the power efficiency mode for the miner.
//!
//! - Command: [SetMinerPowerMode]
//! - ApiDoc: <https://apidoc.whatsminer.com/#api-Miner-btminer_set_power_mode>
use core::str;
use crate::{
command::{Command, CommandLevel},
error::Result,
};
/// This command represents the `set.miner.power_mode` operation.
///
/// Sets the power efficiency mode for the miner. Valid values:
/// `low`, `normal`, `high`.
///
/// - ApiDoc: <https://apidoc.whatsminer.com/#api-Miner-btminer_set_power_mode>
///
/// # Example
/// ```rust,no_run
/// use matroskin::actor::Actor;
/// use matroskin::account::Account;
/// use matroskin::password::Password;
/// use matroskin::command::set_miner_power_mode::SetMinerPowerMode;
///
/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error>> {
/// let addr = "10.10.10.10:4433";
/// let username = Account::Super;
/// let password = Password::Super;
/// let actor = Actor::new(addr, username, password);
/// actor.connect()?;
///
/// let cmd = SetMinerPowerMode::new("normal");
/// let response = actor.send(cmd).await?;
/// println!("Response: {:#?}", response);
///
/// Ok(())
/// }
/// ```
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SetMinerPowerMode {
/// Power efficiency mode (`low`, `normal`, `high`)
pub mode: String,
}
impl SetMinerPowerMode {
/// Create a new `set.miner.power_mode` command.
pub fn new(mode: impl Into<String>) -> Self {
Self { mode: mode.into() }
}
}
impl Command for SetMinerPowerMode {
type Response = String;
const CMD_NAME: &'static str = "set.miner.power_mode";
const LEVEL: CommandLevel = CommandLevel::Secured;
fn params(&self) -> Result<Option<impl serde::Serialize>> {
Ok(Some(&self.mode))
}
}
#[cfg(test)]
mod tests {
use crate::account::Account;
use crate::auth_data::AuthData;
use super::*;
const RESPONSE_JSON: &str =
r#"{"code":0,"when":1692685512,"msg":"ok","desc":"set.miner.power_mode"}"#;
#[test]
fn request_has_param() {
let cmd = SetMinerPowerMode::new("normal");
assert!(cmd.is_secured());
assert!(!cmd.is_encrypted());
let auth = AuthData::new::<SetMinerPowerMode>(Account::Super, "pass", "salt").unwrap();
let encoded = cmd.encode(Some(auth)).unwrap();
let json: serde_json::Value = serde_json::from_slice(&encoded.0).unwrap();
assert_eq!(json["cmd"], "set.miner.power_mode");
assert_eq!(json["param"], "normal");
assert_eq!(json["account"], "super");
assert!(json["ts"].as_u64().unwrap() > 0);
assert_eq!(json["token"].as_str().unwrap().len(), 8);
}
#[test]
fn request_without_auth_omits_token() {
let cmd = SetMinerPowerMode::new("low");
let encoded = cmd.encode(None).unwrap();
let json: serde_json::Value = serde_json::from_slice(&encoded.0).unwrap();
assert!(json.get("token").is_none());
assert_eq!(json["param"], "low");
}
#[test]
fn deserialize_response_fixture() {
let response = SetMinerPowerMode::parse_response(RESPONSE_JSON.as_bytes()).unwrap();
assert!(response.code.is_success());
assert_eq!(response.desc, "set.miner.power_mode");
assert_eq!(response.when, 1692685512);
assert_eq!(response.msg, "ok");
}
}