From 090fc39455ee0af92451de4a36fa0c76df489e07 Mon Sep 17 00:00:00 2001 From: lunar-mining Date: Sun, 8 May 2022 12:23:15 +0200 Subject: [PATCH] dnetview: add external_addr to node info * add external addr to Model.NodeInfo * parse external addr from RPC * display in View --- bin/dnetview/src/error.rs | 6 ++++-- bin/dnetview/src/main.rs | 16 ++++++++++++++-- bin/dnetview/src/model.rs | 10 ++++++++-- bin/dnetview/src/view.rs | 7 ++++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/bin/dnetview/src/error.rs b/bin/dnetview/src/error.rs index 95adbebad..1913fd005 100644 --- a/bin/dnetview/src/error.rs +++ b/bin/dnetview/src/error.rs @@ -9,12 +9,14 @@ pub enum DnetViewError { ValueIsNotObject, #[error("Failed to find ID at current index")] NoIdAtIndex, - #[error("Found unexpected data in View")] - UnexpectedData(String), #[error("Message log does not contain ID")] CannotFindId, #[error("ID does not return a selectable object")] NotSelectableObject, + #[error("JSON data does not contain an external addr")] + NoExternalAddr, + #[error("Found unexpected data in View")] + UnexpectedData(String), #[error("InternalError")] Darkfi(#[from] darkfi::error::Error), #[error("Json serialization error: `{0}`")] diff --git a/bin/dnetview/src/main.rs b/bin/dnetview/src/main.rs index 3deea80f9..c85ad02e4 100644 --- a/bin/dnetview/src/main.rs +++ b/bin/dnetview/src/main.rs @@ -165,7 +165,7 @@ async fn parse_data( client: &DnetView, model: Arc, ) -> DnetViewResult<()> { - let _ext_addr = reply.get("external_addr"); + let addr = &reply.get("external_addr"); let inbound = &reply["session_inbound"]; let manual = &reply["session_manual"]; let outbound = &reply["session_outbound"]; @@ -174,7 +174,9 @@ async fn parse_data( let node_name = &client.name; let node_id = make_node_id(node_name)?; + //let external_addr = ext_addr.unwrap().as_str().unwrap(); + let ext_addr = parse_external_addr(addr).await?; let in_session = parse_inbound(inbound, &node_id).await?; let out_session = parse_outbound(outbound, &node_id).await?; let man_session = parse_manual(manual, &node_id).await?; @@ -183,7 +185,7 @@ async fn parse_data( sessions.push(out_session.clone()); sessions.push(man_session.clone()); - let node = NodeInfo::new(node_id.clone(), node_name.to_string(), sessions.clone()); + let node = NodeInfo::new(node_id.clone(), node_name.to_string(), sessions.clone(), ext_addr); update_node(model.clone(), node.clone(), node_id.clone()).await; update_selectable_and_ids(model.clone(), sessions.clone(), node.clone()).await?; @@ -247,6 +249,16 @@ async fn update_selectable_and_ids( Ok(()) } +async fn parse_external_addr(addr: &Option<&Value>) -> DnetViewResult { + match addr { + Some(addr) => match addr.as_str() { + Some(addr) => return Ok(addr.to_string()), + None => return Ok("null".to_string()), + }, + None => Err(DnetViewError::NoExternalAddr), + } +} + async fn parse_inbound(inbound: &Value, node_id: &String) -> DnetViewResult { let name = "Inbound".to_string(); let session_type = Session::Inbound; diff --git a/bin/dnetview/src/model.rs b/bin/dnetview/src/model.rs index e7c894ada..156e906f4 100644 --- a/bin/dnetview/src/model.rs +++ b/bin/dnetview/src/model.rs @@ -40,11 +40,17 @@ pub struct NodeInfo { pub id: String, pub name: String, pub children: Vec, + pub external_addr: String, } impl NodeInfo { - pub fn new(id: String, name: String, children: Vec) -> NodeInfo { - NodeInfo { id, name, children } + pub fn new( + id: String, + name: String, + children: Vec, + external_addr: String, + ) -> NodeInfo { + NodeInfo { id, name, children, external_addr } } } diff --git a/bin/dnetview/src/view.rs b/bin/dnetview/src/view.rs index 8931265df..25912e83a 100644 --- a/bin/dnetview/src/view.rs +++ b/bin/dnetview/src/view.rs @@ -194,9 +194,10 @@ impl View { let info = self.selectables.get(&selected); match info { - Some(SelectableObject::Node(_node)) => { - //let name_span = Spans::from("Node Info"); - //spans.push(name_span); + Some(SelectableObject::Node(node)) => { + let node_info = + Span::styled(format!("External addr: {}", node.external_addr), style); + lines.push(Spans::from(node_info)); } Some(SelectableObject::Session(_session)) => { //let name_span = Spans::from("Session Info");