nameplate_cli.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //! 姓名牌命令行入口(开发期对照用;镜像 Python CLI 参数)。
  2. //! cargo run -p toolbox-core --example nameplate_cli -- <名单.xlsx> [--班级 X] [--座右铭 M] [--模板 T] [--sheet S] [--输出目录 D] [--保留模板]
  3. use std::path::PathBuf;
  4. use toolbox_core::nameplate::{run_nameplate, NameplateInput, DEFAULT_MOTTO};
  5. fn main() {
  6. let args: Vec<String> = std::env::args().collect();
  7. if args.len() < 2 {
  8. eprintln!("用法: nameplate_cli <名单.xlsx> [--班级 X] [--座右铭 M] [--模板 T] [--sheet S] [--输出目录 D] [--保留模板]");
  9. std::process::exit(2);
  10. }
  11. let roster = PathBuf::from(&args[1]);
  12. let mut class_override: Option<String> = None;
  13. let mut motto: String = DEFAULT_MOTTO.to_string();
  14. let mut template: Option<PathBuf> = None;
  15. let mut sheet: Option<String> = None;
  16. let mut out_dir: Option<PathBuf> = None;
  17. let mut keep_template = false;
  18. let mut i = 2;
  19. while i < args.len() {
  20. match args[i].as_str() {
  21. "--班级" => {
  22. i += 1;
  23. class_override = Some(args[i].clone());
  24. }
  25. "--座右铭" => {
  26. i += 1;
  27. motto = args[i].clone();
  28. }
  29. "--模板" => {
  30. i += 1;
  31. template = Some(PathBuf::from(&args[i]));
  32. }
  33. "--sheet" => {
  34. i += 1;
  35. sheet = Some(args[i].clone());
  36. }
  37. "--输出目录" => {
  38. i += 1;
  39. out_dir = Some(PathBuf::from(&args[i]));
  40. }
  41. "--保留模板" => keep_template = true,
  42. _ => {
  43. eprintln!("未知参数: {}", args[i]);
  44. std::process::exit(2);
  45. }
  46. }
  47. i += 1;
  48. }
  49. let inp = NameplateInput {
  50. roster_path: roster,
  51. class_override,
  52. motto,
  53. template,
  54. auto_dirs: vec![std::env::current_dir().unwrap_or_default()],
  55. sheet,
  56. out_dir: out_dir.unwrap_or_else(|| {
  57. std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."))
  58. }),
  59. keep_template,
  60. };
  61. match run_nameplate(&inp) {
  62. Ok(res) => {
  63. for l in &res.log {
  64. println!("{}", l);
  65. }
  66. }
  67. Err(e) => {
  68. eprintln!("{}", e);
  69. std::process::exit(1);
  70. }
  71. }
  72. }