mirror of
https://github.com/SinTan1729/movie-rename.git
synced 2024-12-25 11:48:37 -06:00
new: Autocomplete files generation
This commit is contained in:
parent
b4073357f7
commit
83bf1f7af6
7 changed files with 86 additions and 43 deletions
10
Cargo.lock
generated
10
Cargo.lock
generated
|
@ -173,6 +173,15 @@ dependencies = [
|
||||||
"strsim",
|
"strsim",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_complete"
|
||||||
|
version = "4.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_lex"
|
name = "clap_lex"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
|
@ -550,6 +559,7 @@ name = "movie-rename"
|
||||||
version = "2.2.2"
|
version = "2.2.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
|
"clap_complete",
|
||||||
"inquire",
|
"inquire",
|
||||||
"load_file",
|
"load_file",
|
||||||
"tmdb-api",
|
"tmdb-api",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "movie-rename"
|
name = "movie-rename"
|
||||||
version = "2.2.2"
|
version = "2.2.2"
|
||||||
|
build = "build.rs"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Sayantan Santra <sayantan[dot]santra689[at]gmail[dot]com"]
|
authors = ["Sayantan Santra <sayantan[dot]santra689[at]gmail[dot]com"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
@ -22,6 +23,10 @@ load_file = "1.0.1"
|
||||||
tokio = { version = "1.32.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.32.0", features = ["macros", "rt-multi-thread"] }
|
||||||
clap = { version = "4.5.1", features = ["cargo"] }
|
clap = { version = "4.5.1", features = ["cargo"] }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
clap = { version = "4.5.1", features = ["cargo"] }
|
||||||
|
clap_complete = "4.5.1"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
strip = true
|
strip = true
|
||||||
opt-level = "z"
|
opt-level = "z"
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -19,6 +19,6 @@ uninstall:
|
||||||
rm -f "$(DESTDIR)$(PREFIX)/man/man1/$(PKGNAME).1"
|
rm -f "$(DESTDIR)$(PREFIX)/man/man1/$(PKGNAME).1"
|
||||||
|
|
||||||
aur: build
|
aur: build
|
||||||
tar --transform 's/.*\///g' -czf $(PKGNAME).tar.gz target/release/$(PKGNAME) $(PKGNAME).1
|
tar --transform 's/.*\///g' -czf $(PKGNAME).tar.gz target/release/$(PKGNAME) target/autocomplete/* $(PKGNAME).1
|
||||||
|
|
||||||
.PHONY: build build-debug install clean uninstall aur
|
.PHONY: build build-debug install clean uninstall aur
|
||||||
|
|
21
build.rs
Normal file
21
build.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
use clap_complete::generate_to;
|
||||||
|
use clap_complete::shells::{Bash, Fish, Zsh};
|
||||||
|
use std::env;
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::fs::{create_dir, remove_dir_all};
|
||||||
|
use std::io::Error;
|
||||||
|
|
||||||
|
include!("src/args.rs");
|
||||||
|
|
||||||
|
fn main() -> Result<(), Error> {
|
||||||
|
let target = "./target/autocomplete";
|
||||||
|
remove_dir_all(target).ok();
|
||||||
|
create_dir(target)?;
|
||||||
|
let outdir = OsString::from(target);
|
||||||
|
|
||||||
|
let mut cmd = get_command();
|
||||||
|
generate_to(Bash, &mut cmd, "movie-rename", &outdir)?;
|
||||||
|
generate_to(Fish, &mut cmd, "movie-rename", &outdir)?;
|
||||||
|
generate_to(Zsh, &mut cmd, "movie-rename", &outdir)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
46
src/args.rs
Normal file
46
src/args.rs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
use clap::{arg, command, ArgAction, Command, ValueHint};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
// Bare command generation function to help with autocompletion
|
||||||
|
pub fn get_command() -> Command {
|
||||||
|
command!()
|
||||||
|
.name("movie-rename")
|
||||||
|
.author("Sayantan Santra <sayantan.santra@gmail.com>")
|
||||||
|
.about("A simple tool to rename movies, written in Rust.")
|
||||||
|
.arg(arg!(-d --directory "Run in directory mode").action(ArgAction::SetTrue))
|
||||||
|
.arg(arg!(-n --"dry-run" "Do a dry run").action(ArgAction::SetTrue))
|
||||||
|
.arg(arg!(-l --"i-feel-lucky" "Always choose the first option").action(ArgAction::SetTrue))
|
||||||
|
.arg(
|
||||||
|
arg!([entries] "The files/directories to be processed")
|
||||||
|
.trailing_var_arg(true)
|
||||||
|
.num_args(1..)
|
||||||
|
.value_hint(ValueHint::AnyPath)
|
||||||
|
.required(true),
|
||||||
|
)
|
||||||
|
// Use -v instead of -V for version
|
||||||
|
.disable_version_flag(true)
|
||||||
|
.arg(arg!(-v --version "Print version").action(ArgAction::Version))
|
||||||
|
.arg_required_else_help(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to process the passed arguments
|
||||||
|
pub fn process_args() -> (Vec<String>, HashMap<String, bool>) {
|
||||||
|
let matches = get_command().get_matches();
|
||||||
|
|
||||||
|
// Generate the settings HashMap from read flags
|
||||||
|
let mut settings = HashMap::new();
|
||||||
|
for id in matches.ids().map(|x| x.as_str()) {
|
||||||
|
if id != "entries" {
|
||||||
|
settings.insert(id.to_string(), matches.get_flag(id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Every unmatched argument should be treated as a file entry
|
||||||
|
let entries: Vec<String> = matches
|
||||||
|
.get_many::<String>("entries")
|
||||||
|
.expect("No entries provided!")
|
||||||
|
.cloned()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
(entries, settings)
|
||||||
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
use clap::{arg, command, ArgAction};
|
|
||||||
use inquire::{
|
use inquire::{
|
||||||
ui::{Color, IndexPrefix, RenderConfig, Styled},
|
ui::{Color, IndexPrefix, RenderConfig, Styled},
|
||||||
InquireError, Select,
|
InquireError, Select,
|
||||||
|
@ -206,45 +205,6 @@ pub async fn process_file(
|
||||||
(filename_without_ext, Some(new_name_base), true)
|
(filename_without_ext, Some(new_name_base), true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to process the passed arguments
|
|
||||||
pub fn process_args() -> (Vec<String>, HashMap<String, bool>) {
|
|
||||||
let matches = command!()
|
|
||||||
.name("movie-rename")
|
|
||||||
.author("Sayantan Santra <sayantan.santra@gmail.com>")
|
|
||||||
.about("A simple tool to rename movies, written in Rust.")
|
|
||||||
.arg(arg!(-d --directory "Run in directory mode").action(ArgAction::SetTrue))
|
|
||||||
.arg(arg!(-n --"dry-run" "Do a dry run").action(ArgAction::SetTrue))
|
|
||||||
.arg(arg!(-l --"i-feel-lucky" "Always choose the first option").action(ArgAction::SetTrue))
|
|
||||||
.arg(
|
|
||||||
arg!([entries] "The files/directories to be processed")
|
|
||||||
.trailing_var_arg(true)
|
|
||||||
.num_args(1..)
|
|
||||||
.required(true),
|
|
||||||
)
|
|
||||||
// Use -v instead of -V for version
|
|
||||||
.disable_version_flag(true)
|
|
||||||
.arg(arg!(-v --version "Print version").action(ArgAction::Version))
|
|
||||||
.arg_required_else_help(true)
|
|
||||||
.get_matches();
|
|
||||||
|
|
||||||
// Generate the settings HashMap from read flags
|
|
||||||
let mut settings = HashMap::new();
|
|
||||||
for id in matches.ids().map(|x| x.as_str()) {
|
|
||||||
if id != "entries" {
|
|
||||||
settings.insert(id.to_string(), matches.get_flag(id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Every unmatched argument should be treated as a file entry
|
|
||||||
let entries: Vec<String> = matches
|
|
||||||
.get_many::<String>("entries")
|
|
||||||
.expect("No entries provided!")
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
(entries, settings)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RenderConfig for the menu items
|
// RenderConfig for the menu items
|
||||||
fn get_render_config() -> RenderConfig {
|
fn get_render_config() -> RenderConfig {
|
||||||
let mut render_config = RenderConfig::default();
|
let mut render_config = RenderConfig::default();
|
||||||
|
|
|
@ -4,13 +4,14 @@ use tmdb_api::Client;
|
||||||
|
|
||||||
// Import all the modules
|
// Import all the modules
|
||||||
mod functions;
|
mod functions;
|
||||||
use functions::{process_args, process_file};
|
use functions::process_file;
|
||||||
|
mod args;
|
||||||
mod structs;
|
mod structs;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
// Process the passed arguments
|
// Process the passed arguments
|
||||||
let (entries, settings) = process_args();
|
let (entries, settings) = args::process_args();
|
||||||
let flag_dry_run = settings["dry-run"];
|
let flag_dry_run = settings["dry-run"];
|
||||||
let flag_directory = settings["directory"];
|
let flag_directory = settings["directory"];
|
||||||
let flag_lucky = settings["i-feel-lucky"];
|
let flag_lucky = settings["i-feel-lucky"];
|
||||||
|
|
Loading…
Reference in a new issue