args.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. use std::path::PathBuf;
  2. use clap::{Parser, Subcommand, ValueEnum};
  3. #[derive(Debug, Clone, Parser, PartialEq, Eq)]
  4. #[command(
  5. name = "rusty-claude-cli",
  6. version,
  7. about = "Rust Claude CLI prototype"
  8. )]
  9. pub struct Cli {
  10. #[arg(long, default_value = "claude-3-7-sonnet")]
  11. pub model: String,
  12. #[arg(long, value_enum, default_value_t = PermissionMode::WorkspaceWrite)]
  13. pub permission_mode: PermissionMode,
  14. #[arg(long)]
  15. pub config: Option<PathBuf>,
  16. #[arg(long, value_enum, default_value_t = OutputFormat::Text)]
  17. pub output_format: OutputFormat,
  18. #[command(subcommand)]
  19. pub command: Option<Command>,
  20. }
  21. #[derive(Debug, Clone, Subcommand, PartialEq, Eq)]
  22. pub enum Command {
  23. /// Read upstream TS sources and print extracted counts
  24. DumpManifests,
  25. /// Print the current bootstrap phase skeleton
  26. BootstrapPlan,
  27. /// Run a non-interactive prompt and exit
  28. Prompt { prompt: Vec<String> },
  29. }
  30. #[derive(Debug, Clone, Copy, ValueEnum, PartialEq, Eq)]
  31. pub enum PermissionMode {
  32. ReadOnly,
  33. WorkspaceWrite,
  34. DangerFullAccess,
  35. }
  36. #[derive(Debug, Clone, Copy, ValueEnum, PartialEq, Eq)]
  37. pub enum OutputFormat {
  38. Text,
  39. Json,
  40. Ndjson,
  41. }
  42. #[cfg(test)]
  43. mod tests {
  44. use clap::Parser;
  45. use super::{Cli, Command, OutputFormat, PermissionMode};
  46. #[test]
  47. fn parses_requested_flags() {
  48. let cli = Cli::parse_from([
  49. "rusty-claude-cli",
  50. "--model",
  51. "claude-3-5-haiku",
  52. "--permission-mode",
  53. "read-only",
  54. "--config",
  55. "/tmp/config.toml",
  56. "--output-format",
  57. "ndjson",
  58. "prompt",
  59. "hello",
  60. "world",
  61. ]);
  62. assert_eq!(cli.model, "claude-3-5-haiku");
  63. assert_eq!(cli.permission_mode, PermissionMode::ReadOnly);
  64. assert_eq!(
  65. cli.config.as_deref(),
  66. Some(std::path::Path::new("/tmp/config.toml"))
  67. );
  68. assert_eq!(cli.output_format, OutputFormat::Ndjson);
  69. assert_eq!(
  70. cli.command,
  71. Some(Command::Prompt {
  72. prompt: vec!["hello".into(), "world".into()]
  73. })
  74. );
  75. }
  76. }