Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Lines 63-76 are the builder pattern. I think it's the standard idiom: https://aturon.github.io/ownership/builders.html which is familiar from C++ or Java.

Lines 78-107 are "do stuff or handle error". You could do "do stuff or crash" instead more tersely via thing_that_might_fail.unwrap().

I think lines 80-87 for example are idiomatic. Lines 89-100 seem a little strange to me in that they embed one error case in an ok case. I would probably do one error per block, returning the server and then using it in a separate block. But I'm new to Rust so don't take my word as gospel.

In any case, I think it's true in any language that when you explicitly handle every error in a unique way, your code is longer. I suppose one way to shorten would be to make each error-handling case more similar: just print the error without a unique prefix. Then make a function for each subcommand that returns Result<(), Error> (nothing on success, error on failure). Then the functions could use the try! macro to make the error-handling implicit (the macro automatically propagates error to the caller), and main() could handle all the errors with just one path. Something like:

    fn run() -> Result<(), Error> {
        let config = try!(Config::from_file());
        let server = try!(Server::new(&config));
        server.run()
    }

    fn secret() -> Result<(), Error> {
        let key = try!(generate_macaroon_secret_key());
        println!("{}", key);
        Ok(())
    }

    fn main() {
        ...
        let result = match matches.subcommand() {
            ("run", Some(_)) => run(),
            ("secret", Some(_)) => secret(),
            _ => Err(SomeErrorType::new("no such subcommand")),
        };
        if let Err(e) = result {
            println!("error: {}", e);
            // or to stderr via the ugly:
            // writeln!(&mut stderr, "error: {}", e).unwrap();
            process::exit(1);
        }
    }
EDIT: I suppose you could also make some variation of the try! macro which takes another string to prepend to the error. (Calling or_else with a function to prepend, maybe.) Then you can duplicate the original error messages in this slightly more terse form.


Consider applying for YC's Fall 2026 batch! Applications are open till July 27.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: