#![feature(globs, if_let)]
extern crate gopher;
use gopher::DirEntity;
use gopher::client::Gopher;
use std::io::IoResult;
fn pretty_print(item: &DirEntity) {
use gopher::EntityKind::{Known, Unknown};
use gopher::KnownEntityKind::*;
let kind = match item.kind {
Known(File) => "file",
Known(Dir) => "dir",
Known(CsoQuery) => "cso",
Known(Error) => "err",
Known(MacBinHex) => "binhex",
Known(DosBin) => "dosbin",
Known(Uuenc) => "uuenc",
Known(SearchQuery) => "search",
Known(Telnet) => "tel",
Known(Binary) => "bin",
Known(RedundantServer) => "server",
Known(Tn3270) => "tn3270",
Known(Gif) => "gif",
Known(Html) => "html",
Known(Info) => "info",
Known(Image) => "img",
Unknown(_) => "?"
};
println!("[{:>6}] {}", kind, item.display);
}
fn stuff() -> IoResult<()> {
let gopher = Gopher::new("freeshell.org", 70);
let menu = try!(gopher.root());
if let Some(dir) = menu.iter().find(|&x| x.is_dir()) {
println!("found dir, path = {}", String::from_utf8_lossy(&*dir.selector));
for x in try!(gopher.fetch_dir(&*dir.selector)).iter() {
pretty_print(x);
}
}
Ok(())
}
fn main() {
match stuff() {
Err(e) => {
let mut err = std::io::stdio::stderr();
let _ = writeln!(&mut err, "error: {}", e);
std::os::set_exit_status(1);
}
_ => {}
}
}