use super::*;
pub async fn current_minute(api: &Factom)-> Result<ApiResponse<CurrentMinute>> {
let req = ApiRequest::new("current-minute");
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn diagnostics(api: &Factom) -> Result<ApiResponse<Diagnostics>> {
let req = ApiRequest::new("diagnostics");
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn entry_credit_rate(api: &Factom)-> Result<ApiResponse<EcRate>> {
let req = ApiRequest::new("entry-credit-rate");
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn heights(api: &Factom)-> Result<ApiResponse<Heights>> {
let req = ApiRequest::new("heights");
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn properties(api: &Factom)-> Result<ApiResponse<Properties>> {
let req = ApiRequest::new("properties");
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn receipt(
api: &Factom,
hash: &str,
includerawentry: bool
)-> Result<ApiResponse<Receipt>>
{
let mut req = ApiRequest::new("receipt");
req.params.insert("hash".to_string(), json!(hash));
if includerawentry {
req.params.insert("includerawentry".to_string(), json!(true));
}
let response = factomd_call(api, req).await;
parse(response).await
}
pub async fn send_raw_message(
api: &Factom,
msg: &str
)-> Result<ApiResponse<Receipt>>
{
let mut req = ApiRequest::new("send-raw-message");
req.params.insert("message".to_string(), json!(msg));
let response = factomd_call(api, req).await;
parse(response).await
}
pub fn str_to_hex(utf8: &str) -> String {
let strs: Vec<String> = utf8.as_bytes()
.iter()
.map(|b| format!("{:02X}", b))
.collect();
strs.join("")
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CurrentMinute {
pub leaderheight: i64,
pub directoryblockheight: i64,
pub minute: i64,
pub currentblockstarttime: i64,
pub currentminutestarttime: i64,
pub currenttime: i64,
pub directoryblockinseconds: i64,
pub stalldetected: bool,
pub faulttimeout: i64,
pub roundtimeout: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Diagnostics {
pub name: String,
pub id: String,
pub publickey: String,
pub role: String,
pub leaderheight: i64,
#[serde(default)]
pub currentheight: i64,
pub currentminute: i64,
pub currentminuteduration: f64,
pub previousminuteduration: f64,
pub balancehash: String,
pub tempbalancehash: String,
pub lastblockfromdbstate: bool,
pub syncing: Syncing,
pub authset: Authset,
pub elections: Elections,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Syncing {
pub status: String,
#[serde(default)]
pub received: i64,
#[serde(default)]
pub expected: i64,
#[serde(default)]
pub missing: Vec<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Authset {
pub leaders: Vec<Leader>,
pub audits: Vec<Audit>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Leader {
pub id: String,
pub vm: i64,
pub listheight: i64,
pub listlength: i64,
pub nextnil: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Audit {
pub id: String,
pub online: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Elections {
pub inprogress: bool,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EcRate {
pub rate: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Heights {
pub directoryblockheight: i64,
pub leaderheight: i64,
pub entryblockheight: i64,
pub entryheight: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Properties {
pub factomdversion: String,
pub factomdapiversion: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Receipt {
pub receipt: ReceiptInner,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReceiptInner {
pub entry: Entry,
pub merklebranch: Vec<Merklebranch>,
pub entryblockkeymr: String,
pub directoryblockkeymr: String,
pub directoryblockheight: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Entry {
pub entryhash: String,
#[serde(default)]
pub raw: String,
pub timestamp: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Merklebranch {
pub left: String,
pub right: String,
pub top: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn current_minute_test() {
let client = Factom::open_node();
let query = current_minute(&client);
let response = fetch(query).expect("Fetching query");
assert!(response.result.directoryblockheight > 1)
}
#[test]
fn diagnostics_test() {
let client = Factom::open_node();
let query = diagnostics(&client);
let response = fetch(query).expect("Fetching query");
assert!(response.result.leaderheight > 1)
}
#[test]
fn entry_credit_rate_test() {
let client = Factom::open_node();
let query = entry_credit_rate(&client);
let response = fetch(query).expect("Fetching query");
assert!(response.result.rate > 1)
}
#[test]
fn heights_test() {
let client = Factom::open_node();
let query = heights(&client);
let response = fetch(query).expect("Fetching query");
assert!(response.result.directoryblockheight > 1)
}
#[test]
fn properties_test() {
let client = Factom::open_node();
let query = properties(&client);
let response = fetch(query).expect("Fetching query");
assert!(response.result.factomdversion.len() > 1)
}
}