1use 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
30pub 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