ripper 0.1.0

Simple client/server, UDP based, utility that returns the IP of the client.
Documentation
extern crate clap;
use clap::{App, Arg, ArgMatches};
use std::io::Write;
use std::net::IpAddr;

fn main() {
    let port = ripper::DEFAULT_PORT.to_string();
    let args = App::new(ripper::NAME)
        .version(ripper::VERSION)
        .author(ripper::AUTHOR)
        .about(ripper::ABOUT)
        .arg(
            Arg::with_name("port")
                .short("p")
                .long("port")
                .help("Set a different port from the default of 44353")
                .default_value(&port)
                .takes_value(true),
        ).arg(
            Arg::with_name("host")
                .help("Sets the Rip server host")
                .required(true)
                .index(1),
        ).get_matches();

    match run(&args) {
        Ok(ip) => {
            print!("{}", ip);
            std::io::stdout().flush().unwrap();
        }
        Err(err) => {
            println!("{}", err);
            std::process::exit(1);
        }
    }
}

fn run(args: &ArgMatches) -> Result<IpAddr, String> {
    let port_str = args.value_of("port").unwrap();
    let port: u16 = match port_str.parse() {
        Ok(v) => v,
        Err(_) => return Err("Port must be a valid unsigned 16bit integer".to_string()),
    };

    let dest = match ripper::parse_socket_addr(args.value_of("host").unwrap(), port) {
        Ok(v) => v,
        Err(err) => return Err(err),
    };

    ripper::run_client(dest)
}