diff options
| author | salmonik <raisersoft@proton.me> | 2026-06-06 19:48:22 +0300 |
|---|---|---|
| committer | salmonik <raisersoft@proton.me> | 2026-06-06 19:48:22 +0300 |
| commit | d347d89dfeef54d648ffdea054897617c0016509 (patch) | |
| tree | 0ea0e25e2a8e9bcdd8c06ffadbe29721a7f07f77 /src/cli.rs | |
| parent | dirty, broken commit (diff) | |
| download | rsplayer-d347d89dfeef54d648ffdea054897617c0016509.tar.gz rsplayer-d347d89dfeef54d648ffdea054897617c0016509.zip | |
correctly working auto completion for db
Diffstat (limited to '')
| -rw-r--r-- | src/cli.rs | 43 |
1 files changed, 24 insertions, 19 deletions
| @@ -95,12 +95,9 @@ pub enum Commands { | |||
| 95 | #[clap(hide = true)] | 95 | #[clap(hide = true)] |
| 96 | /// Complete artists, albums, or tracks from database | 96 | /// Complete artists, albums, or tracks from database |
| 97 | DbComplete { | 97 | DbComplete { |
| 98 | /// Entity type: artists, albums, or tracks | 98 | /// Query string (e.g. \"J\", \"Artist/\", \"Artist/Album/\") |
| 99 | #[arg(value_name = "ENTITY")] | 99 | #[arg(value_name = "QUERY")] |
| 100 | entity: String, | 100 | query: String, |
| 101 | /// Optional prefix to match | ||
| 102 | #[arg(value_name = "PREFIX")] | ||
| 103 | prefix: Option<String>, | ||
| 104 | }, | 101 | }, |
| 105 | } | 102 | } |
| 106 | 103 | ||
| @@ -245,7 +242,23 @@ impl Cli { | |||
| 245 | } | 242 | } |
| 246 | } | 243 | } |
| 247 | } | 244 | } |
| 248 | Commands::DbComplete { entity, prefix } => { | 245 | Commands::DbComplete { query } => { |
| 246 | // Unescape shell escapes in the input query | ||
| 247 | let query = { | ||
| 248 | let mut unescaped = String::with_capacity(query.len()); | ||
| 249 | let mut chars = query.chars(); | ||
| 250 | while let Some(c) = chars.next() { | ||
| 251 | if c == '\\' { | ||
| 252 | if let Some(next) = chars.next() { | ||
| 253 | unescaped.push(next); | ||
| 254 | } | ||
| 255 | } else { | ||
| 256 | unescaped.push(c); | ||
| 257 | } | ||
| 258 | } | ||
| 259 | unescaped | ||
| 260 | }; | ||
| 261 | |||
| 249 | let config = match Config::load() { | 262 | let config = match Config::load() { |
| 250 | Ok(c) => c, | 263 | Ok(c) => c, |
| 251 | Err(_) => return Ok(()), | 264 | Err(_) => return Ok(()), |
| @@ -254,19 +267,11 @@ impl Cli { | |||
| 254 | Ok(d) => d, | 267 | Ok(d) => d, |
| 255 | Err(_) => return Ok(()), | 268 | Err(_) => return Ok(()), |
| 256 | }; | 269 | }; |
| 257 | let prefix = prefix.as_deref().unwrap_or(""); | 270 | |
| 258 | let results: Vec<String> = match entity.as_str() { | 271 | let results = db.complete(&query).unwrap_or_default(); |
| 259 | "artists" => db.complete_artists(prefix).unwrap_or_default(), | 272 | |
| 260 | "albums" => db.complete_albums(prefix).unwrap_or_default(), | ||
| 261 | "tracks" => db.complete_tracks(prefix).unwrap_or_default(), | ||
| 262 | _ => Vec::new(), | ||
| 263 | }; | ||
| 264 | let suffix = match entity.as_str() { | ||
| 265 | "artists" | "albums" => "/", | ||
| 266 | _ => "", | ||
| 267 | }; | ||
| 268 | for r in &results { | 273 | for r in &results { |
| 269 | println!("{r}{suffix}"); | 274 | println!("{r}"); |
| 270 | } | 275 | } |
| 271 | } | 276 | } |
| 272 | Commands::Completions { shell } => { | 277 | Commands::Completions { shell } => { |
