Skip to main content

twin_cli/
cli.rs

1// This file is kept for backward compatibility
2// The actual CLI implementation is now in cli/mod.rs
3
4pub mod commands;
5mod output;
6
7use clap::{Parser, Subcommand};
8use std::path::PathBuf;
9
10/// CLIのメインエントリーポイント
11/// clapのderiveマクロを使って自動的にコマンドライン引数をパース
12#[derive(Parser)]
13#[command(name = "twin")]
14#[command(about = "Git worktree and symlink environment manager", long_about = None)]
15pub struct Cli {
16    #[command(subcommand)]
17    pub command: Commands,
18}
19
20/// 利用可能なサブコマンドの定義
21#[derive(Subcommand)]
22pub enum Commands {
23    /// ワークツリーを追加(デフォルトで新規ブランチを作成)
24    Add(AddArgs),
25
26    /// ワークツリーを追加(addのエイリアス、後方互換性のため)
27    Create(AddArgs),
28
29    /// 全てのワークツリーをリスト表示
30    #[command(alias = "ls")]
31    List(ListArgs),
32
33    /// ワークツリーを削除
34    #[command(alias = "delete")]
35    Remove(RemoveArgs),
36
37    /// 設定を管理
38    Config(ConfigArgs),
39
40    /// TUIインターフェースを起動
41    Tui,
42
43    /// 設定ファイルを初期化
44    Init(InitArgs),
45}
46
47/// addコマンドの引数(twin独自の使いやすい順序)
48#[derive(Parser)]
49pub struct AddArgs {
50    /// ブランチ名またはコミット
51    pub branch: String,
52
53    /// ワークツリーのパス(省略時は設定のworktree_base/ブランチ名)
54    pub path: Option<PathBuf>,
55
56    /// 新しいブランチを作成
57    #[arg(short = 'b', long)]
58    pub new_branch: Option<String>,
59
60    /// 新しいブランチを強制的に作成
61    #[arg(short = 'B', long)]
62    pub force_branch: Option<String>,
63
64    /// デタッチモード
65    #[arg(short = 'd', long)]
66    pub detach: bool,
67
68    /// ロックする
69    #[arg(long)]
70    pub lock: bool,
71
72    /// 追跡モードを設定
73    #[arg(long)]
74    pub track: bool,
75
76    /// 追跡モードを無効
77    #[arg(long)]
78    pub no_track: bool,
79
80    /// リモートブランチを推測
81    #[arg(long)]
82    pub guess_remote: bool,
83
84    /// リモートブランチを推測しない
85    #[arg(long)]
86    pub no_guess_remote: bool,
87
88    /// チェックアウトしない
89    #[arg(long)]
90    pub no_checkout: bool,
91
92    /// quietモード
93    #[arg(short = 'q', long)]
94    pub quiet: bool,
95
96    /// twin固有: 設定ファイルのパス
97    #[arg(short = 'c', long)]
98    pub config: Option<PathBuf>,
99
100    /// twin固有: 作成後にパスを表示
101    #[arg(long)]
102    pub print_path: bool,
103
104    /// twin固有: 作成後にcdコマンドを表示
105    #[arg(long)]
106    pub cd_command: bool,
107
108    /// twin固有: 副作用をスキップしてgit worktreeのみ実行
109    #[arg(long)]
110    pub git_only: bool,
111
112    /// twin固有: ブランチの新規作成を無効化(既存ブランチのみ使用)
113    #[arg(long, help = "既存のブランチのみを使用し、新規ブランチを作成しない")]
114    pub no_create: bool,
115}
116
117/// listコマンドの引数
118#[derive(Parser)]
119pub struct ListArgs {
120    /// 出力フォーマット (table, json, simple)
121    #[arg(short, long, default_value = "table")]
122    pub format: String,
123}
124
125/// removeコマンドの引数(git worktree removeと互換)
126#[derive(Parser)]
127pub struct RemoveArgs {
128    /// 削除するワークツリーのパスまたは名前
129    pub worktree: String,
130
131    /// 確認なしで強制削除
132    #[arg(short, long)]
133    pub force: bool,
134
135    /// 設定ファイルのパス
136    #[arg(short, long, value_name = "FILE")]
137    pub config: Option<PathBuf>,
138
139    /// git worktree removeのみ実行(副作用をスキップ)
140    #[arg(long)]
141    pub git_only: bool,
142
143    /// 出力を抑制
144    #[arg(short, long)]
145    pub quiet: bool,
146}
147
148/// configコマンドの引数
149#[derive(Parser)]
150pub struct ConfigArgs {
151    /// サブコマンド(default, show, etc)
152    pub subcommand: Option<String>,
153
154    /// 現在の設定を表示
155    #[arg(long)]
156    pub show: bool,
157
158    /// 設定値をセット (key=value形式)
159    #[arg(long)]
160    pub set: Option<String>,
161
162    /// 設定値を取得
163    #[arg(long)]
164    pub get: Option<String>,
165}
166
167/// initコマンドの引数
168#[derive(Parser)]
169pub struct InitArgs {
170    /// 設定ファイルのパス(デフォルト: twin.toml)
171    #[arg(short, long)]
172    pub path: Option<PathBuf>,
173
174    /// 既存のファイルを上書き
175    #[arg(short, long)]
176    pub force: bool,
177}