{"id":13672161,"url":"https://github.com/auula/falsework","last_synced_at":"2025-08-18T21:16:48.880Z","repository":{"id":47840696,"uuid":"391670225","full_name":"auula/falsework","owner":"auula","description":"A tool crate to quickly build rust command line application.","archived":false,"fork":false,"pushed_at":"2023-01-12T22:42:21.000Z","size":42,"stargazers_count":101,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T22:37:15.030Z","etag":null,"topics":["cli","cli-app","command","command-line","command-line-interface","rust","rust-book","rust-crate","rust-lang","rustlang"],"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/auula.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}},"created_at":"2021-08-01T15:49:57.000Z","updated_at":"2025-02-27T22:39:44.000Z","dependencies_parsed_at":"2023-02-09T13:45:57.267Z","dependency_job_id":null,"html_url":"https://github.com/auula/falsework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auula%2Ffalsework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auula%2Ffalsework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auula%2Ffalsework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auula%2Ffalsework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/auula","download_url":"https://codeload.github.com/auula/falsework/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248109763,"owners_count":21049370,"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":["cli","cli-app","command","command-line","command-line-interface","rust","rust-book","rust-crate","rust-lang","rustlang"],"created_at":"2024-08-02T09:01:28.014Z","updated_at":"2025-04-09T20:41:16.714Z","avatar_url":"https://github.com/auula.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Falsework \n\n![https://img.shields.io/badge/falsework-Rust%20CLI-brightgreen](https://img.shields.io/badge/falsework-Rust%20Crates-yellow)\n[![Go](https://github.com/higker/falsework/actions/workflows/coverage.yml/badge.svg?event=push)](https://github.com/auula/falsework/actions/workflows/coverage.yml)\n[![codecov](https://codecov.io/gh/auula/falsework/branch/main/graph/badge.svg?token=22QKRI2IFE)](https://codecov.io/gh/auula/falsework)\n![https://img.shields.io/github/repo-size/auula/falsework](https://img.shields.io/github/repo-size/auula/falsework)\n![https://img.shields.io/crates/v/falsework](https://img.shields.io/crates/v/falsework)\n[![License](https://img.shields.io/badge/license-MIT-db5149.svg)](https://github.com/higker/falsework/blob/master/LICENSE)\n\nA tool crate to quickly build rust command line application.\n\n\n## 导入依赖\n\n在你的项目中添加依赖如下：\n\n```toml\n[dependencies]\nfalsework = \"0.1.0\"\n```\n\n\n## 快速构建\n\n```rust\nuse std::error::Error;\nuse falsework::{app, cmd};\n\nfn main() {\n    \n    // 通过falsework创建一个骨架\n    let mut app = falsework::app::new();\n    \n    \n    // 应用元数据信息\n    app.name(\"calculator\")\n        .author(\"Leon Ding \u003cding@ibyte.me\u003e\")\n        .version(\"0.0.1\")\n        .description(\"A calculator that only supports addition.\");\n\n    // 构建命令行项\n    let mut command = cmd::CommandItem {\n        // run add命令所对应命令行逻辑代码\n        run: |ctx| -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n            // 通过上下文获取flag绑定的数据\n            let x = ctx.value_of(\"--x\").parse::\u003ci32\u003e().unwrap();\n            let y = ctx.value_of(\"--y\").parse::\u003ci32\u003e().unwrap();\n            println!(\"{} + {} = {}\", x, y, x + y);\n            // 如果处理发生了错误则调用 cmd::err_msg 会优雅的退出\n            // Err(cmd::err_msg(\"Application produce error！\"));\n            Ok(())\n        },\n        // 命令帮助信息\n        long: \"这是一个加法计算程序需要两个flag参数 --x --y\",\n        // 命令介绍\n        short: \"加法计算\",\n        // 通过add激活命令\n        r#use: \"add\",\n    }.build();\n    \n    // 给add命令绑定flag\n    command.bound_flag(\"--x\", \"加数\");\n    command.bound_flag(\"--y\", \"被加数\");\n    \n    // 往app里面添加一个命令集\n    app.add_cmd(command);\n    \n    // 最后run 程序开始监听命令行输入\n    app.run();\n}\n```\n\n上面这个例子运行起来结果:\n\n```shell\n$: ./calculator add --x=10 --y=10\n10 + 10 = 20\n```\n\n到此为止你就快速构建一个命令行计算器了，你只需要写你核心逻辑，其他操作`falsework`帮助你完成。\n\n1. 例如如果我不记得了命令了，只记得一个单词或者字母，程序会帮助你修复：\n\n```shell\n$: ./calculator a\n\nYou need this command ?\n\tadd\na : The corresponding command set was not found!\n```\n2. 可以看到程序提示你有一个对应的`add`命令可以使用，如果不知道`add`有啥参数，在后面\n加上`--help`即可获得帮助信息：\n\n```shell\n$: ./calculator add --help\n\nHelp:\n  这是一个加法计算程序需要两个flag参数 --x --y\n\nUsage:\n  calculator add [flags]\n\nFlags:\n  --y, 被加数\n  --x, 加数\n```\n构建出来主程序预览：\n\n```shell\n$: ./calculator\n\n\nA calculator that only supports addition.\ncalculator 0.0.1 Leon Ding \u003cding@ibyte.me\u003e\n\nUsage:\n  calculator  [command]\n\nAvailable Commands:\n  add\t加法计算\n\nFlags:\n  --help   help for calculator\n\nUse \"calculator [command] --help\" for more information about a command.\n```\n\n## 其他操作\n有多种构建方式，例如下面的：\n\n```rust\n    #[test]\n    fn test_add_commands() {\n        let mut app = falsework::app::new();\n\n        app.name(\"calculator\")\n            .author(\"Leon Ding \u003cding@ibyte.me\u003e\")\n            .version(\"0.0.2\")\n            .description(\"A command line program built with Falsework.\");\n\n\n        let command_list = vec![\n            cmd::CommandItem {\n                run: |_ctx| -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n                    // _ctx.args 获取命令行参数\n                    println!(\"call foo command.\");\n                    Ok(())\n                },\n                long: \"这是一个测试命令，使用foo将调用foo命令。\",\n                short: \"foo命令\",\n                r#use: \"foo\",\n            },\n            cmd::CommandItem {\n                run: |_ctx| -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n                    println!(\"call bar command.\");\n                    Ok(())\n                },\n                long: \"这是一个测试命令，使用bar将调用bar命令。\",\n                short: \"bar命令\",\n                r#use: \"bar\",\n            },\n        ].iter().map(|c| c.build()).collect();\n\n        app.commands(command_list);\n\n        println!(\"{:#?}\", app);\n    }\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fauula%2Ffalsework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fauula%2Ffalsework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fauula%2Ffalsework/lists"}