wowlab_cli/commands/snapshot/
mod.rs1mod assisted_rotas;
2pub(crate) mod db;
3mod decode_loadout;
4mod dump_assisted;
5mod dump_spell;
6mod dump_trait;
7mod sync;
8
9use anyhow::Result;
10use clap::{
11 Subcommand,
12 builder::{PossibleValue, PossibleValuesParser, TypedValueParser},
13 error::ErrorKind,
14};
15use wowlab_fs::path::PathBuf;
16use wowlab_types::table_registry::GameDataTable;
17
18#[rustfmt::skip]
19pub(crate) use sync::{SyncCredentials, run_sync_with_credentials};
20
21#[derive(Debug, Subcommand)]
23#[non_exhaustive]
24pub enum SnapshotCommand {
25 Sync(SyncArgs),
27 DumpSpell(DumpSpellArgs),
29 DumpTrait(DumpTraitArgs),
31 DumpAssisted(DumpAssistedArgs),
33 AssistedRotas(AssistedRotasArgs),
35 DecodeLoadout(DecodeLoadoutArgs),
37}
38
39impl SnapshotCommand {
40 pub async fn run(self) -> Result<()> {
45 match self {
46 Self::Sync(args) => sync::run_sync(args).await,
47 Self::DumpSpell(args) => dump_spell::run_dump_spell(&args),
48 Self::DumpTrait(args) => dump_trait::run_dump_trait(&args),
49 Self::DumpAssisted(args) => dump_assisted::run_dump_assisted(&args),
50 Self::AssistedRotas(args) => assisted_rotas::run_assisted_rotas(args).await,
51 Self::DecodeLoadout(args) => decode_loadout::run_decode_loadout(&args),
52 }
53 }
54}
55
56#[derive(Clone)]
57struct GameDataTableValueParser {
58 possible_values: PossibleValuesParser,
59}
60
61impl GameDataTableValueParser {
62 fn new() -> Self {
63 let values = GameDataTable::iter().map(|table| PossibleValue::new(table.command_name()));
64
65 Self {
66 possible_values: PossibleValuesParser::new(values),
67 }
68 }
69}
70
71impl TypedValueParser for GameDataTableValueParser {
72 type Value = GameDataTable;
73
74 fn parse_ref(
75 &self,
76 cmd: &clap::Command,
77 arg: Option<&clap::Arg>,
78 value: &std::ffi::OsStr,
79 ) -> std::result::Result<Self::Value, clap::Error> {
80 let value = self.possible_values.parse_ref(cmd, arg, value)?;
81
82 value.parse::<GameDataTable>().map_err(|parse_error| {
83 clap::Error::raw(ErrorKind::InvalidValue, parse_error.to_string())
84 })
85 }
86
87 fn possible_values(&self) -> Option<Box<dyn Iterator<Item = PossibleValue> + '_>> {
88 self.possible_values.possible_values()
89 }
90}
91
92#[derive(Debug, clap::Args)]
94pub struct SyncArgs {
95 #[arg(long)]
97 pub patch: String,
98
99 #[arg(long, default_value = "./data")]
101 pub data_dir: PathBuf,
102
103 #[arg(long)]
105 pub dry_run: bool,
106
107 #[arg(long)]
109 pub json_only: bool,
110
111 #[arg(long = "table", value_parser = GameDataTableValueParser::new())]
113 pub tables: Vec<GameDataTable>,
114}
115
116#[derive(Debug, clap::Args)]
118pub struct DumpSpellArgs {
119 pub spell_id: i32,
121
122 #[arg(long, default_value = "./data")]
124 pub data_dir: PathBuf,
125}
126
127#[derive(Debug, clap::Args)]
129pub struct DumpTraitArgs {
130 pub spec_id: i32,
132
133 #[arg(long, default_value = "./data")]
135 pub data_dir: PathBuf,
136}
137
138#[derive(Debug, clap::Args)]
140pub struct DumpAssistedArgs {
141 #[arg(long)]
143 pub spec_id: Option<i32>,
144
145 #[arg(long, default_value = "./data")]
147 pub data_dir: PathBuf,
148
149 #[arg(long)]
151 pub out_dir: Option<PathBuf>,
152}
153
154#[derive(Clone, Copy, Debug, Eq, PartialEq, clap::ValueEnum)]
156#[non_exhaustive]
157pub enum AssistedRotasMode {
158 Dump,
160 Upsert,
162 Both,
164}
165
166#[derive(Debug, clap::Args)]
168pub struct AssistedRotasArgs {
169 #[arg(long, default_value = "./data")]
171 pub data_dir: PathBuf,
172
173 #[arg(long)]
175 pub spec_id: Option<i32>,
176
177 #[arg(long, value_enum, default_value_t = AssistedRotasMode::Dump)]
179 pub mode: AssistedRotasMode,
180
181 #[arg(long, default_value = "dumps/engine-assisted-rotas")]
183 pub out_dir: PathBuf,
184
185 #[arg(long)]
187 pub user_id: Option<String>,
188
189 #[arg(long, default_value = "assisted")]
191 pub slug_prefix: String,
192
193 #[arg(long, default_value = "Assisted")]
195 pub name_prefix: String,
196
197 #[arg(long)]
199 pub is_public: bool,
200}
201
202#[derive(Debug, clap::Args)]
204pub struct DecodeLoadoutArgs {
205 pub loadout: String,
207
208 #[arg(long)]
210 pub data_dir: Option<PathBuf>,
211}