main.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // select each connection and show log of traffic
  2. // use rpc to get some info from the ircd network
  3. // ircd::logger keeps track of network info
  4. // map rpc polls logger for info about nodes, etc
  5. use darkfi::{
  6. error::{Error, Result},
  7. rpc::{jsonrpc, jsonrpc::JsonResult},
  8. };
  9. use log::{debug, error};
  10. use serde_json::{json, Value};
  11. use std::{io, io::Read, time::Duration};
  12. use termion::{async_stdin, event::Key, input::TermRead, raw::IntoRawMode};
  13. use tui::{
  14. backend::{Backend, TermionBackend},
  15. Terminal,
  16. };
  17. use map::{ui, App};
  18. struct Map {
  19. url: String,
  20. }
  21. impl Map {
  22. pub fn new(url: String) -> Self {
  23. Self { url }
  24. }
  25. async fn request(&self, r: jsonrpc::JsonRequest) -> Result<Value> {
  26. let reply: JsonResult = match jsonrpc::send_request(&self.url, json!(r)).await {
  27. Ok(v) => v,
  28. Err(e) => return Err(e),
  29. };
  30. match reply {
  31. JsonResult::Resp(r) => {
  32. debug!(target: "RPC", "<-- {}", serde_json::to_string(&r)?);
  33. Ok(r.result)
  34. }
  35. JsonResult::Err(e) => {
  36. debug!(target: "RPC", "<-- {}", serde_json::to_string(&e)?);
  37. Err(Error::JsonRpcError(e.error.message.to_string()))
  38. }
  39. JsonResult::Notif(n) => {
  40. debug!(target: "RPC", "<-- {}", serde_json::to_string(&n)?);
  41. Err(Error::JsonRpcError("Unexpected reply".to_string()))
  42. }
  43. }
  44. }
  45. }
  46. fn main() -> Result<()> {
  47. // Set up terminal output
  48. let stdout = io::stdout().into_raw_mode()?;
  49. let backend = TermionBackend::new(stdout);
  50. let mut terminal = Terminal::new(backend)?;
  51. // create app and run it
  52. let tick_rate = Duration::from_millis(250);
  53. // here
  54. let app = App::new();
  55. let res = run_app(&mut terminal, app, tick_rate);
  56. terminal.clear()?;
  57. if let Err(err) = res {
  58. println!("{:?}", err)
  59. }
  60. Ok(())
  61. }
  62. fn run_app<B: Backend>(
  63. terminal: &mut Terminal<B>,
  64. mut app: App,
  65. _tick_rate: Duration,
  66. ) -> io::Result<()> {
  67. let mut asi = async_stdin();
  68. terminal.clear()?;
  69. app.node_list.state.select(Some(0));
  70. app.node_info.index = 0;
  71. //let mut last_tick = Instant::now();
  72. loop {
  73. terminal.draw(|f| ui::ui(f, &mut app))?;
  74. for k in asi.by_ref().keys() {
  75. match k.unwrap() {
  76. Key::Char('q') => {
  77. terminal.clear()?;
  78. return Ok(())
  79. }
  80. Key::Char('j') => {
  81. app.node_list.next();
  82. app.node_info.next();
  83. }
  84. Key::Char('k') => {
  85. app.node_list.previous();
  86. app.node_info.previous();
  87. }
  88. _ => (),
  89. }
  90. }
  91. //if last_tick.elapsed() >= tick_rate {
  92. // app.clone().update();
  93. // last_tick = Instant::now();
  94. //}
  95. }
  96. }