use gophermap::{GopherMenu,ItemType};
use std::io::{self, BufRead, BufReader};
use std::net::{TcpListener, TcpStream};
use std::thread;
const HOST: &str = "localhost";
const PORT: u16 = 1234;
fn handle_client(stream: TcpStream) -> io::Result<()> {
let mut line = String::new();
BufReader::new(stream.try_clone()?).read_line(&mut line)?;
let line = line.trim();
println!("New request: {}", line);
let mut menu = GopherMenu::with_write(&stream);
let menu_link = |text: &str, selector: &str|
menu.write_entry(ItemType::Directory, text, selector, HOST, PORT);
match line {
"/" | "" => {
menu.info("Hi!")?;
menu.info("Welcome to my Gopher server!")?;
menu_link("Tomatoes", "/tomato")?;
menu.info("Opinion piece about tomatoes")?;
menu_link("Potatoes", "/potato")?;
menu.info("Opinion piece about potatoes")?;
menu_link("Go to unknown link", "/lel")?;
}
"/tomato" => {
menu.info("Tomatoes are not good")?;
menu_link("Home page", "/")?;
}
"/potato" => {
menu.info("Potatoes are the best")?;
menu_link("Home page", "/")?;
}
x => {
menu.info(&format!("Unknown link: {}", x))?;
menu_link("Home page", "/")?;
}
};
menu.end()?;
Ok(())
}
fn main() -> io::Result<()> {
let listener = TcpListener::bind(format!("{}:{}", HOST, PORT))?;
for stream in listener.incoming() {
thread::spawn(move || handle_client(stream?));
}
Ok(())
}