Sfoglia il codice sorgente

map: refactored App to pass node hashmap

lunar-mining 4 anni fa
parent
commit
771219be7c
5 ha cambiato i file con 75 aggiunte e 101 eliminazioni
  1. 47 83
      bin/map/src/app.rs
  2. 10 7
      bin/map/src/list.rs
  3. 4 2
      bin/map/src/main.rs
  4. 3 0
      bin/map/src/mod.rs
  5. 11 9
      bin/map/src/ui.rs

+ 47 - 83
bin/map/src/app.rs

@@ -1,89 +1,53 @@
-use crate::list::StatefulList;
+use crate::{
+    list::StatefulList,
+    types::{NodeId, NodeInfo},
+};
+use std::collections::HashMap;
 
-pub struct App<'a> {
-    pub nodes: StatefulList<(&'a str)>,
+// the information here should be continually updating
+// nodes are added from the result of rpc requests
+
+#[derive(Clone)]
+pub struct App {
+    pub node_list: StatefulList,
 }
 
-impl<'a> App<'a> {
-    pub fn new() -> App<'a> {
-        App {
-            nodes: StatefulList::with_items(vec![
-                ("node0"),
-                ("node1"),
-                ("node2"),
-                ("node3"),
-                ("node4"),
-                ("node5"),
-                ("node6"),
-                ("node7"),
-                ("node8"),
-                ("node9"),
-                ("node10"),
-                ("node11"),
-                ("node12"),
-                ("node13"),
-                ("node14"),
-                ("node15"),
-                ("node16"),
-                ("node17"),
-                ("node18"),
-                ("node19"),
-                ("node20"),
-                ("node21"),
-                ("node22"),
-                ("node23"),
-                ("node24"),
-                ("node0"),
-                ("node1"),
-                ("node2"),
-                ("node3"),
-                ("node4"),
-                ("node5"),
-                ("node6"),
-                ("node7"),
-                ("node8"),
-                ("node9"),
-                ("node10"),
-                ("node11"),
-                ("node12"),
-                ("node13"),
-                ("node14"),
-                ("node15"),
-                ("node16"),
-                ("node17"),
-                ("node18"),
-                ("node19"),
-                ("node20"),
-                ("node21"),
-                ("node22"),
-                ("node23"),
-                ("node24"),
-                ("node0"),
-                ("node1"),
-                ("node2"),
-                ("node3"),
-                ("node4"),
-                ("node5"),
-                ("node6"),
-                ("node7"),
-                ("node8"),
-                ("node9"),
-                ("node10"),
-                ("node11"),
-                ("node12"),
-                ("node13"),
-                ("node14"),
-                ("node15"),
-                ("node16"),
-                ("node17"),
-                ("node18"),
-                ("node19"),
-                ("node20"),
-                ("node21"),
-                ("node22"),
-                ("node23"),
-                ("node24"),
-            ]),
+impl App {
+    pub fn new() -> App {
+        let mut hashmap: HashMap<NodeId, NodeInfo> = HashMap::new();
+
+        let id = Self::get_node_id();
+        let info = Self::get_node_info();
+
+        hashmap.insert(id, info);
+        App { node_list: StatefulList::new(hashmap) }
+    }
+
+    fn get_node_id() -> String {
+        let mut node_list = String::new();
+        for num in 1..10000 {
+            let new_nodes = format!("\n Node {}\n", num);
+            node_list.push_str(&new_nodes);
         }
+        node_list
     }
+
+    fn get_node_info() -> String {
+        let mut node_info = String::new();
+        for num in 1..10000 {
+            let new_info = format!(
+                "\nConnections: {}\n
+                \n Recent messages: ...",
+                num
+            );
+            node_info.push_str(&new_info);
+        }
+        node_info
+    }
+
+    // TODO: implement this
+    //fn update(&mut self) {
+    //    let node = self.node.remove(0);
+    //    self.nodes.push(node);
+    //}
 }

+ 10 - 7
bin/map/src/list.rs

@@ -1,19 +1,22 @@
+use crate::types::{NodeId, NodeInfo};
+use std::collections::HashMap;
 use tui::widgets::ListState;
 
-pub struct StatefulList<T> {
+#[derive(Clone)]
+pub struct StatefulList {
     pub state: ListState,
-    pub items: Vec<T>,
+    pub nodes: HashMap<NodeId, NodeInfo>,
 }
 
-impl<T> StatefulList<T> {
-    pub fn with_items(items: Vec<T>) -> StatefulList<T> {
-        StatefulList { state: ListState::default(), items }
+impl StatefulList {
+    pub fn new(nodes: HashMap<NodeId, NodeInfo>) -> StatefulList {
+        StatefulList { state: ListState::default(), nodes }
     }
 
     pub fn next(&mut self) {
         let i = match self.state.selected() {
             Some(i) => {
-                if i >= self.items.len() - 1 {
+                if i >= self.nodes.len() - 1 {
                     0
                 } else {
                     i + 1
@@ -28,7 +31,7 @@ impl<T> StatefulList<T> {
         let i = match self.state.selected() {
             Some(i) => {
                 if i == 0 {
-                    self.items.len() - 1
+                    self.nodes.len() - 1
                 } else {
                     i - 1
                 }

+ 4 - 2
bin/map/src/main.rs

@@ -11,6 +11,7 @@ use tui::{
 
 pub mod app;
 pub mod list;
+pub mod types;
 pub mod ui;
 
 use crate::app::App;
@@ -23,6 +24,7 @@ fn main() -> Result<(), io::Error> {
 
     // create app and run it
     let tick_rate = Duration::from_millis(250);
+    // here
     let app = App::new();
     let res = run_app(&mut terminal, app, tick_rate);
 
@@ -54,8 +56,8 @@ fn run_app<B: Backend>(
                     terminal.clear()?;
                     return Ok(())
                 }
-                Key::Char('j') => app.nodes.next(),
-                Key::Char('k') => app.nodes.previous(),
+                Key::Char('j') => app.node_list.next(),
+                Key::Char('k') => app.node_list.previous(),
                 _ => (),
             }
         }

+ 3 - 0
bin/map/src/mod.rs

@@ -1,7 +1,10 @@
 pub mod list;
 pub mod app;
 pub mod ui;
+pub mod types;
 
 pub use list::StatefulList;
 pub use app::App;
 pub use ui::ui;
+pub use types::NodeId;
+pub use types::NodeInfo;

+ 11 - 9
bin/map/src/ui.rs

@@ -2,7 +2,7 @@ use crate::app::App;
 use tui::{
     backend::Backend,
     style::{Color, Modifier, Style},
-    text::{Spans},
+    text::Spans,
     widgets::{Block, Borders, List, ListItem},
     Frame,
 };
@@ -10,22 +10,24 @@ use tui::{
 pub fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
     let size = f.size();
 
-    let items: Vec<ListItem> = app
+    let nodes: Vec<ListItem> = app
+        .node_list
         .nodes
-        .items
         .iter()
-        .map(|i| {
-            let lines = vec![Spans::from(i.to_string())];
-            ListItem::new(lines).style(Style::default())
+        .map(|(id, info)| {
+            let line1 = vec![Spans::from(id.to_string())];
+            let line2 = vec![Spans::from(info.to_string())];
+            ListItem::new(line1).style(Style::default());
+            ListItem::new(line2).style(Style::default())
         })
         .collect();
 
-    // Create a List from all list items and highlight the currently selected one
-    let items = List::new(items)
+    // Create a List from all list nodes and highlight the currently selected one
+    let nodes = List::new(nodes)
         .block(Block::default().borders(Borders::ALL).title("List of nodes"))
         .highlight_style(Style::default().bg(Color::Black).add_modifier(Modifier::BOLD))
         .highlight_symbol(">> ");
 
     // Render the item list
-    f.render_stateful_widget(items, size, &mut app.nodes.state);
+    f.render_stateful_widget(nodes, size, &mut app.node_list.state);
 }