diff options
| author | Teddy Wing | 2017-05-07 15:00:19 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2017-05-07 15:00:19 +0200 | 
| commit | 3408f710221daece5d170dbd6a0dbfde64af8c39 (patch) | |
| tree | cc0c54a1ff4632ccaa4ee2b86b8932d1533a27b9 | |
| parent | fd3bf8eb6ebd588850df17c243aae07fdd0259f6 (diff) | |
| parent | 69dd2a7a23d1d71c50a91f5779db6f0480106cd8 (diff) | |
| download | HearURL-3408f710221daece5d170dbd6a0dbfde64af8c39.tar.bz2 | |
Merge branch 'command-line-arguments'
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/main.rs | 52 | 
3 files changed, 56 insertions, 4 deletions
| @@ -2,10 +2,16 @@  name = "hearurl"  version = "0.0.1"  dependencies = [ + "getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",   "url 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",  ]  [[package]] +name = "getopts" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]]  name = "idna"  version = "0.1.1"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -43,6 +49,7 @@ dependencies = [  ]  [metadata] +"checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685"  "checksum idna 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ac85ec3f80c8e4e99d9325521337e14ec7555c458a14e377d189659a427f375"  "checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"  "checksum unicode-bidi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3a078ebdd62c0e71a709c3d53d2af693fe09fe93fbff8344aebe289b78f9032" @@ -3,4 +3,5 @@ name = "hearurl"  version = "0.0.1"  [dependencies] +getopts = "0.2"  url = "1.4.0" diff --git a/src/main.rs b/src/main.rs index b4c7781..60780fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,19 @@ +extern crate getopts; + +use getopts::Options; + +use std::env;  use std::io::{self, Write};  use std::io::prelude::*;  use std::net::TcpListener;  use std::process::Command; -fn open_stream() -> io::Result<()> { -    let listener = TcpListener::bind("127.0.0.1:34254")?; +const DEFAULT_PORT: u16 = 37705; + +fn open_stream(browser: String, port: u16) -> io::Result<()> { +    let listener = TcpListener::bind( +        format!("127.0.0.1:{}", port) +    )?;      for stream in listener.incoming() {          match stream { @@ -14,7 +23,7 @@ fn open_stream() -> io::Result<()> {                  Command::new("open")                      .arg("-a") -                    .arg("Opera") +                    .arg(&browser)                      // Trim the trailing newline, otherwise this doesn't                      // work @@ -30,8 +39,43 @@ fn open_stream() -> io::Result<()> {      Ok(())  } +fn print_usage(opts: Options) { +    let brief = "Usage: hearurl -b BROWSER"; +    print!("{}", opts.usage(&brief)); +} +  fn main() { -    open_stream().unwrap_or_else(|e| { +    let args: Vec<String> = env::args().collect(); + +    let mut opts = Options::new(); +    opts.optopt("b", "browser", "set browser", "BROWSER"); +    opts.optopt("p", "port", "set port number", "PORT"); +    opts.optflag("h", "help", "print this help menu"); + +    let opt_matches = match opts.parse(&args[1..]) { +        Ok(m) => m, +        Err(e) => panic!(e.to_string()), +    }; + +    if opt_matches.opt_present("h") { +        print_usage(opts); +        return +    } + +    let browser = match opt_matches.opt_str("b") { +        Some(b) => b, +        None => { +            print_usage(opts); +            return +        }, +    }; + +    let port: u16 = match opt_matches.opt_str("p") { +        Some(p) => p.parse().unwrap(), +        None => DEFAULT_PORT, +    }; + +    open_stream(browser, port).unwrap_or_else(|e| {          writeln!(io::stderr(), "{}", e)              .expect("Failed printing to stderr");      }); | 
