Update main.rs

+ added a ui using cursive.
+ moved server star and stop into the ui.
+ added specific functions for constructing the ui
This commit is contained in:
michael-bailey 2020-08-03 12:43:53 +01:00
parent 22ed3db6bb
commit 20afff2931
1 changed files with 124 additions and 16 deletions

View File

@ -1,23 +1,131 @@
#[macro_use]
extern crate lazy_static;
#![feature(test)]
mod client_api;
mod commands;
mod server;
use crate::server::server_profile::Server;
use client_api::ClientApi;
use crossterm::ErrorKind;
use cursive::{
Cursive,
menu::*,
event::Key,
views::{ Dialog, TextView, LinearLayout, ListView, ResizedView, Panel },
Rect,
CursiveExt,
align::{Align, HAlign},
view::SizeConstraint,
};
use std::sync::Arc;
use log::info;
fn main(){
lazy_static! {
static ref server_name: &'static str = "Server-01";
static ref server_address: &'static str = "0.0.0.0:6000";
static ref server_author: &'static str = "noreply@email.com";
static ref SERVER: Server<'static> = Server::new(&server_name, &server_address, &server_author);
}
/*
let server_name = String::from("Server-01");
let server_address = String::from("0.0.0.0:6000");
let server_author = String::from("noreply@email.com");
*/
fn main() -> Result<(), ErrorKind> {
let server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com");
let server_arc = Arc::new(server);
let s1 = server_arc.clone();
let s2 = s1.clone();
//let server = Server::new(server_name, server_address, server_author);
SERVER.start();
cursive::logger::init();
info!("Main: init Display");
let mut Display = Cursive::default();
info!("Main: setting up callbacks");
Display.add_global_callback(Key::Backspace, |s| s.quit());
Display.add_global_callback(Key::Tab, |s| s.toggle_debug_console());
Display.add_global_callback(Key::Esc, |s| s.select_menubar());
info!("Main: setting up menu bar");
let _ = Display.menubar()
.add_subtree("Server",
MenuTree::new()
.leaf("About",
|s| s.add_layer(About()))
.delimiter()
.leaf("quit", |s| s.quit()))
.add_subtree("File",
MenuTree::new()
.leaf("Start", move |s| {s1.start();})
.leaf("Stop", move |s| {s2.stop();})
.delimiter()
.leaf("Debug", |s| {s.toggle_debug_console();}));
info!("Main: entering loop");
Display.add_layer(Control_Panel());
Display.run();
Ok(())
}
fn About() -> Dialog {
Dialog::new()
.content(TextView::new("Rust-Chat-Server\nmade by\n Mitchell Hardie\nMichael Bailey\nMit Licence")
).button("Close", |s| {let _ = s.pop_layer(); s.add_layer(Control_Panel())} )
}
fn Launch_screen() -> Dialog {
Dialog::new()
.content(TextView::new("\
Server.
* press <ESC> for menu bar
* press <TAB> for debug (FIXME)
* press <DEL> to exit.
").align(Align::center()))
.button("ok", |s| {s.pop_layer();})
}
fn Control_Panel() -> ResizedView<Panel<LinearLayout>> {
let mut root = LinearLayout::horizontal();
let mut left = LinearLayout::vertical();
let mut right = ListView::new();
right.add_child("test", TextView::new(""));
right.add_child("test", TextView::new(""));
right.add_delimiter();
right.add_child("test", TextView::new(""));
right.add_child("test", TextView::new(""));
left.add_child(TextView::new("Hello world"));
root.add_child(left);
root.add_child(right);
ResizedView::new(SizeConstraint::AtLeast(32), SizeConstraint::AtLeast(32), Panel::new(root))
}
// MARK: - general testing zone
#[cfg(test)]
mod tests {
#![feature(test)]
use super::Server;
use crate::client_api::ClientApi;
use std::thread::spawn;
use std::collections::HashMap;
use crate::commands::Commands;
#[test]
fn test_server_info() {
// setup the server
let name = "Server-01";
let address = "0.0.0.0:6000";
let owner = "noreply@email.com";
let server = Server::new(name, address, owner);
let _ = server.start().unwrap();
let api = ClientApi::get_info("127.0.0.1:6000");
if api.is_some() {
let mut map = HashMap::new();
map.insert("name".to_string(), name.to_string());
map.insert("owner".to_string(), owner.to_string());
let expected = Commands::Info(Some(map));
let api = api.unwrap();
assert_eq!(api, expected);
} else {
return
}
}
}