Git Product home page Git Product logo

paw's Introduction

paw

crates.io version build status downloads docs.rs docs

Command line argument paw-rser abstraction for main.

Paw's goal is to show that C's idea of passing arguments into main wasn't that bad at all, but just needed a bit of oxidation to make it work with Rust.

Paw defines a trait, a proc macro, and an example implementation that when combined allow you to pass fully parsed arguments to main. Gone is the need to remember which methods to call in order to parse arguments in the CLI. Instead paw makes command line parsing feel first-class

Examples

#[paw::main]
fn main(args: paw::Args) {
    for arg in args {
        println!("{:?}", arg);
    }
}

More Examples

Installation

$ cargo add paw

Safety

This crate uses #![deny(unsafe_code)] to ensure everything is implemented in 100% Safe Rust.

Contributing

Want to join us? Check out our "Contributing" guide and take a look at some of these issues:

FAQ

How does paw work?

The paw::main attribute allows fn main to take any argument that implements the paw::ParseArgs trait. paw::ParseArgs implements one method: parse_args which returns a Result<Self>.

Any errors that are generated are returned back from fn main, and the returned Result type is in control of how to print them.

What is the relationship to C?

In C's runtime, arguments command line arguments are passed as a combination of "number of arguments" (argc), and a "list of arguments" (argv):

int main(int argc, char **argv) {
    for(i = 1; i < argc; i++) {
        printf("%s",argv[i]);
    }
    return 0;
}

In Rust this would translate to an iterator of arguments, which is what std::env::Args provides, which is wrapped in paw through paw::Args.

What's the future for paw?

Paw is an experiment by the CLI WG to provide a better command line experience for everyone. Our hypothesis is that by moving command line parsing to fn main Rust's command line experience can become more intuitive and easy to use.

We hope to gather feedback how this works for people, and see how we can integrate with existing libraries. This will take time, and we might change things in the process.

If this experiment proves to be successful, we might move to formalize the features Paw provide into Rust itself through the RFC process. But that's not the case yet, so for now: we hope you enjoy Paw, and we'd love to hear your about your experiences using it!

License

MIT OR Apache-2.0

paw's People

Contributors

dylan-dpc avatar yoshuawuyts avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.