1use std::ops::{Deref, Not};
2
3use clap::{Args, Parser};
4use clap_complete::Shell;
5
6#[derive(Parser, Debug)]
8#[clap(version, about, author)]
9pub struct Opt {
10 #[clap(subcommand)]
12 pub command: Command,
13}
14
15#[derive(Parser, Debug)]
16pub enum Command {
17 #[clap(alias = "mig")]
18 Migrate(MigrateOpt),
19
20 Completions { shell: Shell },
22}
23
24#[derive(Parser, Debug)]
26pub struct MigrateOpt {
27 #[clap(subcommand)]
28 pub command: MigrateCommand,
29}
30
31#[derive(Parser, Debug)]
32pub enum MigrateCommand {
33 Add {
39 description: String,
40
41 #[clap(flatten)]
42 source: Source,
43 },
44
45 Init {
47 #[clap(flatten)]
48 connect_opts: ConnectOpts,
49 },
50
51 Run {
53 #[clap(flatten)]
54 source: Source,
55
56 #[clap(long)]
58 next: bool,
59
60 #[clap(flatten)]
61 connect_opts: ConnectOpts,
62 },
63
64 Revert {
66 #[clap(flatten)]
67 source: Source,
68
69 #[clap(flatten)]
70 connect_opts: ConnectOpts,
71 },
72
73 Info {
75 #[clap(flatten)]
76 source: Source,
77
78 #[clap(flatten)]
79 connect_opts: ConnectOpts,
80 },
81}
82
83#[derive(Args, Debug)]
85pub struct Source {
86 #[clap(long, default_value = "migrations")]
88 source: String,
89}
90
91impl Deref for Source {
92 type Target = String;
93
94 fn deref(&self) -> &Self::Target {
95 &self.source
96 }
97}
98
99#[derive(Args, Debug)]
101pub struct ConnectOpts {
102 #[clap(long, short = 'N', env)]
104 pub scylla_nodes: String,
105
106 #[clap(long, short = 'K', default_value = "scyllax_migrations")]
108 pub keyspace: String,
109
110 #[clap(long, default_value = "10")]
113 pub connect_timeout: u64,
114}
115
116#[derive(Args, Copy, Clone, Debug)]
118pub struct IgnoreMissing {
119 #[clap(long)]
121 ignore_missing: bool,
122}
123
124impl Deref for IgnoreMissing {
125 type Target = bool;
126
127 fn deref(&self) -> &Self::Target {
128 &self.ignore_missing
129 }
130}
131
132impl Not for IgnoreMissing {
133 type Output = bool;
134
135 fn not(self) -> Self::Output {
136 !self.ignore_missing
137 }
138}