{"id":22654238,"url":"https://github.com/stevencyb/ropts","last_synced_at":"2026-02-06T11:33:01.857Z","repository":{"id":256001474,"uuid":"852089765","full_name":"StevenCyb/ropts","owner":"StevenCyb","description":"This is a simple option parsing utility written in Rust.","archived":false,"fork":false,"pushed_at":"2024-09-08T11:16:26.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-13T22:46:36.042Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StevenCyb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-04T07:53:27.000Z","updated_at":"2024-12-02T07:05:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"61120a06-9534-49fa-9597-dbe61044fe27","html_url":"https://github.com/StevenCyb/ropts","commit_stats":null,"previous_names":["stevencyb/ropts"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/StevenCyb/ropts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenCyb%2Fropts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenCyb%2Fropts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenCyb%2Fropts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenCyb%2Fropts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StevenCyb","download_url":"https://codeload.github.com/StevenCyb/ropts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StevenCyb%2Fropts/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265461283,"owners_count":23769768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-09T09:36:00.205Z","updated_at":"2026-02-06T11:32:56.817Z","avatar_url":"https://github.com/StevenCyb.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ROpts\n**NOTE:** *I wrote this library for learning purposes. It may not be completely thought out and error free*. ***Use at Your Own Risk.***\n\n[![Crates.io](https://img.shields.io/crates/v/ropts.svg)](https://crates.io/crates/ropts)\n![CC0 licensed](https://img.shields.io/github/license/StevenCyb/ropts)\n[![Tests](https://github.com/StevenCyb/ropts/actions/workflows/tests.yml/badge.svg)](https://github.com/StevenCyb/ropts/actions/workflows/tests.yml)\n[![Clippy](https://github.com/StevenCyb/ropts/actions/workflows/lint.yml/badge.svg)](https://github.com/StevenCyb/ropts/actions/workflows/lint.yml)\n[![Rustfmt](https://github.com/StevenCyb/ropts/actions/workflows/rustfmt.yml/badge.svg)](https://github.com/StevenCyb/ropts/actions/workflows/rustfmt.yml)\n[![Release](https://github.com/StevenCyb/ropts/actions/workflows/release.yml/badge.svg)](https://github.com/StevenCyb/ropts/actions/workflows/release.yml)\n\nROpts is a simple and intuitive option parsing library for Rust, designed to handle both command line arguments and environment variables. This library aims to make it easy to integrate option parsing into your Rust projects.\n\n## Example\n```rust\n// Import the necessary modules\nuse std::env;\nuse ropts::{compose::Compose, error::Error, options::ValueOption, options::ValuesOption};\n\nfn main() {\n    // Collect the command line arguments and environment variables\n    let args = env::args().collect::\u003cVec\u003cString\u003e\u003e();\n    let envs: Vec\u003c(String, String)\u003e = env::vars().collect();\n\n    // Define the variables to store the parsed values\n    let mut name = None::\u003cString\u003e;\n    let mut age = None::\u003cu8\u003e;\n    let mut employed: Option\u003cbool\u003e = Option::\u003cbool\u003e::None;\n    let mut skills: Option\u003cVec\u003cString\u003e\u003e = None;\n\n    // Define the options\n    let name_option = ValueOption::new(\u0026mut name, \"Your name\")\n        .required()\n        .env(\"DEMO_NAME\")\n        .short_arg('n')\n        .long_arg(\"name\")\n        .additional_eval(|s| {\n            if s.len() \u003c 3 {\n                return Err(Error::Validation(\n                    \"Name must be at least 3 characters\".into(),\n                ));\n            }\n            Ok(())\n        });\n    let age_option = ValueOption::new(\u0026mut age, \"Your age\")\n        .env(\"DEMO_AGE\")\n        .short_arg('a')\n        .long_arg(\"age\")\n        .additional_eval(|a| {\n            if *a \u003c 18 {\n                return Err(Error::Validation(\n                    \"You must be at least 18 years old\".into(),\n                ));\n            }\n            Ok(())\n        });\n    let employed_option = ValueOption::new(\u0026mut employed, \"Are you employed?\")\n        .env(\"DEMO_EMPLOYED\")\n        .short_arg('e')\n        .long_arg(\"employed\")\n        .default(true);\n    let skills_option = ValuesOption::new(\u0026mut skills, \"Your skills\")\n        .env(\"DEMO_SKILLS\")\n        .short_arg('s')\n        .long_arg(\"skills\");\n\n    // Compose the options and parse the command line arguments\n    let result = Compose::new()\n        .args(args.iter().skip(1).cloned())\n        .envs(envs.into_iter())\n        .help(|s| println!(\"{}\", s))\n        .add(name_option)\n        .add(age_option)\n        .add(employed_option)\n        .add(skills_option)\n        .parse();\n\n    // Error handling\n    if let Err(e) = result {\n        eprintln!(\"{}\", e);\n        std::process::exit(1);\n    }\n\n    // Use the parsed values\n    println!(\"Hello, {}!\", name.unwrap());\n    println!(\"You are {} years old\", age.unwrap());\n    println!(\"Are you employed? {}\", employed.unwrap());\n    if skills.is_some() {\n        println!(\"Your skills are: {:?}\", skills.unwrap());\n    } else {\n        println!(\"You have no skills\");\n    }\n}\n```\n\n## Installation\n\nAdd `ropts` as a dependency in your `Cargo.toml`:\n\n```toml\n[dependencies]\nropts = \"0.0.1\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevencyb%2Fropts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevencyb%2Fropts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevencyb%2Fropts/lists"}