1mod errors;
2mod traits;
3pub mod utils;
4
5use crate::utils::app;
6use std::env;
7use std::process::exit;
8use utils::http_server;
9
10pub fn start() {
22 let get_params_result = app::get_params();
23 if get_params_result.is_err() {
24 println!("{}", get_params_result.err().unwrap());
25 exit(1);
26 }
27 let (address, port, source_dir) = get_params_result.unwrap();
28
29 let executable_path = env::current_exe().unwrap();
30 let executable_name = executable_path.file_name().unwrap();
31 if executable_name.is_empty() {
32 println!("Invalid executable");
33 exit(1);
34 }
35
36 let result = http_server::run(address.as_str(), port);
37 if result.is_err() {
38 println!("Http Server Error: {:?}", result.unwrap());
39 exit(1);
40 }
41
42 let listener = result.unwrap();
43
44 let llv_link_addr: String = format!(
45 "http://{}:{}",
46 if address == "::" {
47 "localhost"
48 } else {
49 address.as_str()
50 },
51 port
52 );
53 let link_addr = llv_link_addr.as_str();
54 let source_dir_path = source_dir.as_path();
55
56 for stream in listener.incoming() {
57 let stream = stream.unwrap();
58 http_server::handle_connection(stream, source_dir_path, executable_name, link_addr);
59 }
60}
61#[cfg(test)]
64mod tests {
65 use crate::start;
66 use std::thread;
67 use std::thread::sleep;
68 use std::time::Duration;
69
70 #[test]
71 fn test_start() {
72 let no_panic = true;
73
74 let t = thread::spawn(move || {
75 start();
76 });
77
78 sleep(Duration::new(1, 0));
79 drop(t);
80
81 assert_eq!(no_panic, true);
82 }
83}