{"id":31274078,"url":"https://github.com/julien-cpsn/no_std_clap","last_synced_at":"2025-09-23T22:33:14.134Z","repository":{"id":315314798,"uuid":"1058954312","full_name":"Julien-cpsn/no_std_clap","owner":"Julien-cpsn","description":"no_std compliant clone of rust clap (command line argument parser) with minimal functionalities","archived":false,"fork":false,"pushed_at":"2025-09-17T21:30:14.000Z","size":24,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-17T23:25:03.116Z","etag":null,"topics":["clap","cli","nostd","parser","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Julien-cpsn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-17T19:25:25.000Z","updated_at":"2025-09-17T21:30:17.000Z","dependencies_parsed_at":"2025-09-17T23:25:15.975Z","dependency_job_id":"dc76f713-c011-438c-812d-d80ff5338e50","html_url":"https://github.com/Julien-cpsn/no_std_clap","commit_stats":null,"previous_names":["julien-cpsn/no_std_clap"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Julien-cpsn/no_std_clap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julien-cpsn%2Fno_std_clap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julien-cpsn%2Fno_std_clap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julien-cpsn%2Fno_std_clap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julien-cpsn%2Fno_std_clap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Julien-cpsn","download_url":"https://codeload.github.com/Julien-cpsn/no_std_clap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Julien-cpsn%2Fno_std_clap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276661453,"owners_count":25682021,"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","status":"online","status_checked_at":"2025-09-23T02:00:09.130Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["clap","cli","nostd","parser","rust"],"created_at":"2025-09-23T22:33:12.567Z","updated_at":"2025-09-23T22:33:14.127Z","avatar_url":"https://github.com/Julien-cpsn.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `no_std` clap\n\n`no_std` compliant clone of rust clap (command line argument parser) with minimal functionalities.\n\n\u003e [!WARNING]\n\u003e You still need `alloc`\n\n## Usage\n\n\u003e [!NOTE]\n\u003e You can either use `MyArgs::parse_str(\u0026str)` or `MyArgs::parse_args(Vec\u003c\u0026str\u003e)`.\n\n### With derive\n\n**Basic**\n\n```rust\nuse alloc::string::String;\nuse alloc::vec::Vec;\nuse no_std_clap_core::parser::Parser;\nuse no_std_clap_macros::Parser;\n\n#[derive(Parser, Debug, PartialEq)]\n#[clap(name = \"myapp\", version = \"1.0\")]\nstruct Args {\n    #[arg(short, long, help = \"Name to use\")]\n    name: String,\n\n    #[arg(short, long, required)]\n    count: i32,\n\n    #[arg(short, long, global)]\n    verbose: bool,\n\n    #[arg(short, long)]\n    list: Vec\u003cu8\u003e,\n\n    #[arg(long)]\n    optional: Option\u003cu16\u003e,\n\n    #[arg(long, default_value = \"3\")]\n    optional_with_default: Option\u003cu16\u003e,\n\n    #[arg(skip)]\n    computed: String, // Will use Default::default()\n}\n\nfn my_function() {\n    let result = TestArgs::parse_str(\"--name test --count 42 --verbose --list 5\").unwrap();\n}\n```\n\n**With enums**\n\n```rust\nuse no_std_clap_core::parser::Parser;\nuse no_std_clap_macros::{EnumValuesArg, Parser};\n\n#[derive(Parser, Debug, PartialEq)]\n#[clap(name = \"myapp\", version = \"1.0\")]\nstruct Args {\n    #[arg(short, long)]\n    name: Names,\n\n}\n\n#[derive(EnumValuesArg, Debug, PartialEq)]\nenum Names {\n    John,\n    #[arg(name = \"renamed\")]\n    Marco,\n    ComposedName\n}\n\nfn my_function() {\n    let result = Args::parse_str(\"--name composed-name\").unwrap();\n}\n```\n\n**With subcommand**\n\n```rust\nuse alloc::string::String;\nuse no_std_clap_core::parser::Parser;\nuse no_std_clap_macros::{Args, Parser, Subcommand};\n\n#[derive(Parser, Debug, PartialEq)]\n#[clap(name = \"myapp\", version = \"1.0\", about = \"A sample CLI app\")]\nstruct Cli {\n    #[arg(short, long)]\n    verbose: bool,\n\n    #[command(subcommand)]\n    command: Option\u003cCommands\u003e,\n}\n\n#[derive(Subcommand, Debug, PartialEq)]\nenum Commands {\n    #[command(about = \"Add a new item\")]\n    Add(AddArgs),\n\n    #[command(about = \"Remove an item\")]\n    Remove(RemoveArgs),\n\n    #[command(name = \"list\", about = \"List all items\")]\n    List,\n}\n\n\n#[derive(Args, Debug, PartialEq)]\nstruct AddArgs {\n    #[arg(short, long, required)]\n    name: String,\n\n    #[arg(short, long)]\n    force: bool,\n}\n\n#[derive(Args, Debug, PartialEq)]\nstruct RemoveArgs {\n    #[arg(short, long, required)]\n    name: String,\n\n    #[arg(short, long)]\n    recursive: bool,\n}\n\nfn my_function() {\n    let cli = Cli::parse_str(\"--verbose true add --name test_item --force\").unwrap();\n    \n    if let Some(subcommand) = cli.command {\n        match subcommand {\n            Commands::Add(add_args) =\u003e {},\n            Commands::Remove(remove_args) =\u003e {},\n            Commands::List =\u003e {},\n        }\n    }\n}\n```\n\n### Without derive\n\n**Basic**\n\n```rust\nuse alloc::string::String;\nuse alloc::vec::Vec;\nuse no_std_clap_core::arg::arg_info::ArgInfo;\nuse no_std_clap_core::arg::from_arg::FromArg;\nuse no_std_clap_core::command::Command;\nuse no_std_clap_core::error::ParseError;\nuse no_std_clap_core::parser::Parser;\n\n#[derive(Debug, PartialEq)]\nstruct TestArgs {\n    name: String,\n    count: i32,\n    verbose: bool,\n    list: Vec\u003cu8\u003e,\n    optional: Option\u003cString\u003e,\n}\n\n// Manual implementation of what the derive macro would generate\nimpl Parser for TestArgs {\n    fn parse_args(args: \u0026[String]) -\u003e Result\u003cSelf, ParseError\u003e {\n        let cmd = Command::new(Some(\"test\"), Some(\"0.1.0\"))\n            .arg(ArgInfo::new(\"name\").long(\"name\").short('n').required())\n            .arg(ArgInfo::new(\"count\").long(\"count\").short('c').required())\n            .arg(ArgInfo::new(\"verbose\").long(\"verbose\").short('v'))\n            .arg(ArgInfo::new(\"list\").long(\"list\").short('l').multiple())\n            .arg(ArgInfo::new(\"optional\").long(\"optional\").short('o'));\n\n        let parsed = cmd.parse(args)?;\n\n        let name = parsed\n            .get(\"name\")\n            .ok_or_else(|| ParseError::MissingArgument(\"name\".to_string()))?;\n\n        let count_str = parsed\n            .get(\"count\")\n            .ok_or_else(|| ParseError::MissingArgument(\"count\".to_string()))?;\n\n        let verbose = parsed.contains_key(\"verbose\");\n\n        let list = parsed\n            .get_all(\"list\")\n            .into_iter()\n            .map(|s| u8::from_arg(s).unwrap())\n            .collect();\n\n        let optional = parsed\n            .get(\"optional\")\n            .map(|s| s.clone());\n\n        Ok(TestArgs {\n            name: String::from_arg(name)?,\n            count: i32::from_arg(count_str)?,\n            verbose,\n            list,\n            optional\n        })\n    }\n}\n\nfn my_function() {\n    let result = TestArgs::parse_str(\"--name test --count 42 --verbose true --list 5\").unwrap();\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulien-cpsn%2Fno_std_clap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulien-cpsn%2Fno_std_clap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulien-cpsn%2Fno_std_clap/lists"}