ddmw_client/
probe.rs

1//! Core node inspection functions.
2
3use tokio::io::{AsyncRead, AsyncWrite};
4
5use tokio_util::codec::Framed;
6
7use blather::Telegram;
8
9use crate::err::Error;
10use crate::types;
11
12
13#[derive(Debug)]
14pub struct DDLinkInfo {
15  pub engine: String,
16  pub protocol: types::node::ddlnk::Protocol,
17  pub protimpl: types::node::ddlnk::ProtImpl
18}
19
20
21#[derive(Debug)]
22pub struct NodeInfo {
23  pub version: String,
24  pub os_name: String,
25  pub nodetype: types::node::Type,
26  pub ddlnk: DDLinkInfo
27}
28
29
30/*
31fn parse<T: FromStr>(
32  params: &blather::Params,
33  field: &str
34) -> Result<T, Error> {
35  let val = params.get_str("ddmw.node").map_or_else(
36    || Err(Error::miss_data(format!("{} not found", field))),
37    |s| Ok(s.parse::<T>()?)
38  )?;
39
40  Ok(val)
41}
42*/
43
44
45pub async fn get_nodeinfo<T>(
46  conn: &mut Framed<T, blather::Codec>
47) -> Result<NodeInfo, Error>
48where
49  T: AsyncRead + AsyncWrite + Unpin
50{
51  let mut tg = Telegram::new();
52  tg.set_topic("GetNodeInfo")?;
53  let params = crate::sendrecv(conn, &tg).await?;
54
55  let nodetype = params.get_str("ddmw.node").map_or_else(
56    || Err(Error::miss_data("ddmw.node not found")),
57    |s| s.parse::<types::node::Type>()
58  )?;
59
60  let version = params.get_str("ddmw.version").map_or_else(
61    || Err(Error::miss_data("ddmw.version not found")),
62    |s| Ok(s.to_string())
63  )?;
64
65  let os_name = params.get_str("os.name").map_or_else(
66    || Err(Error::miss_data("os.name not found")),
67    |s| Ok(s.to_string())
68  )?;
69
70  let engine = params.get_str("ddmw.ddlnk.engine").map_or_else(
71    || Err(Error::miss_data("ddmw.ddlnk.engine not found")),
72    |s| Ok(s.to_string())
73  )?;
74
75  let protocol = params.get_str("ddmw.ddlink.protocol").map_or_else(
76    || Err(Error::miss_data("ddmw.ddlink.protocol not found")),
77    |s| s.parse::<types::node::ddlnk::Protocol>()
78  )?;
79
80  let protimpl = params.get_str("ddmw.ddlink.protimpl").map_or_else(
81    || Err(Error::miss_data("ddmw.ddlink.protimpl not found")),
82    |s| s.parse::<types::node::ddlnk::ProtImpl>()
83  )?;
84
85  Ok(NodeInfo {
86    version,
87    os_name,
88    nodetype,
89    ddlnk: DDLinkInfo {
90      engine,
91      protocol,
92      protimpl
93    }
94  })
95}
96
97// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :