You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
phetch/src/main.rs

154 lines
3.9 KiB
Rust

use phetch::{
args, gopher,
ui::{Mode, UI},
};
4 years ago
use std::{env, process};
5 years ago
5 years ago
fn main() {
4 years ago
process::exit(run())
4 years ago
}
/// Start the app. Returns UNIX exit code.
4 years ago
fn run() -> i32 {
let str_args = env::args().skip(1).collect::<Vec<String>>();
let mut cfg = match args::parse(&str_args) {
Ok(c) => c,
Err(e) => {
eprintln!("{}", e);
return 1;
4 years ago
}
};
// check for simple modes
match cfg.mode {
Mode::Raw => return print_raw(&cfg.start, cfg.tls, cfg.tor),
Mode::Version => return print_version(),
Mode::Help => return print_usage(),
Mode::NoTTY => return print_plain(&cfg.start, cfg.tls, cfg.tor),
4 years ago
Mode::Print => cfg.wide = true,
_ => {}
5 years ago
}
// load url
4 years ago
let start = cfg.start.clone();
let mode = cfg.mode;
4 years ago
let mut ui = UI::new(cfg);
if let Err(e) = ui.open(&start, &start) {
eprintln!("{}", e);
return 1;
}
// print rendered version
if mode == Mode::Print {
return match ui.render() {
Ok(screen) => {
println!("{}", screen);
0
}
Err(e) => {
eprintln!("{}", e);
1
}
};
}
// run app
if let Err(e) = ui.run() {
5 years ago
eprintln!("{}", e);
4 years ago
return 1;
}
// and scene
4 years ago
0
5 years ago
}
/// --version
fn print_version() -> i32 {
4 years ago
println!(
"phetch - quick lil gopher client (v{version} - {built})",
built = phetch::BUILD_DATE,
version = phetch::VERSION
);
0
5 years ago
}
/// --help
fn print_usage() -> i32 {
4 years ago
print_version();
5 years ago
println!(
4 years ago
"
4 years ago
Usage:
4 years ago
phetch [options] Launch phetch in interactive mode
phetch [options] url Open Gopher URL in interactive mode
4 years ago
Options:
4 years ago
-s, --tls Try to open Gopher URLs securely w/ TLS
-o, --tor Use local Tor proxy to open all pages
-S, -O Disable TLS or Tor
4 years ago
-r, --raw Print raw Gopher response only
-p, --print Print rendered Gopher response only
-l, --local Connect to 127.0.0.1:7070
4 years ago
4 years ago
-c, --config FILE Use instead of ~/.config/phetch/phetch.conf
-C, --no-config Don't use any config file
4 years ago
-h, --help Show this screen
-v, --version Show phetch version
4 years ago
Command line options always override options set in phetch.conf.
4 years ago
Once you've launched phetch, use `ctrl-h` to view the on-line help."
5 years ago
);
0
5 years ago
}
5 years ago
/// Print just the raw Gopher response.
fn print_raw(url: &str, tls: bool, tor: bool) -> i32 {
4 years ago
match gopher::fetch_url(url, tls, tor) {
Ok((_, response)) => {
println!("{}", response);
0
}
4 years ago
Err(e) => {
5 years ago
eprintln!("{}", e);
1
}
}
}
/// Print a colorless, plain version of the response for a non-tty
/// (like a pipe).
fn print_plain(url: &str, tls: bool, tor: bool) -> i32 {
let mut out = String::new();
let typ = gopher::type_for_url(url);
match gopher::fetch_url(url, tls, tor) {
Ok((_, response)) => match typ {
gopher::Type::Menu => {
// TODO use parse_line()
for line in response.trim_end_matches(".\r\n").lines() {
let line = line.trim_end_matches('\r');
if let Some(desc) = line.splitn(2, '\t').nth(0) {
let desc = desc.trim();
4 years ago
out.push_str(&desc[1..]);
out.push('\n');
}
}
}
gopher::Type::Text => println!("{}", response.trim_end_matches(".\r\n")),
_ => {
eprintln!("can't print gopher type: {:?}", typ);
return 1;
}
},
Err(e) => {
eprintln!("{}", e);
return 1;
4 years ago
}
}
print!("{}", out);
0
5 years ago
}