summaryrefslogtreecommitdiffstats
path: root/zellij-utils
diff options
context:
space:
mode:
authorMarcin Puc <5671049+tranzystorek-io@users.noreply.github.com>2022-01-23 20:59:03 +0100
committerGitHub <noreply@github.com>2022-01-23 20:59:03 +0100
commite58b67ce2ed839dd8cbd2dadabc6e092b0e0b96a (patch)
treee7f4597ed4832cf655691dffdb92a9c32b9407a3 /zellij-utils
parent5f86dc4fd0542e5db22c0263fdaac8cb0309b440 (diff)
chore(deps): update arg parsing to clap v3 (#1017)
* Update arg parsing to clap v3 * Ignore shell argument case
Diffstat (limited to 'zellij-utils')
-rw-r--r--zellij-utils/Cargo.toml3
-rw-r--r--zellij-utils/src/cli.rs56
-rw-r--r--zellij-utils/src/input/options.rs36
-rw-r--r--zellij-utils/src/lib.rs2
-rw-r--r--zellij-utils/src/setup.rs23
5 files changed, 61 insertions, 59 deletions
diff --git a/zellij-utils/Cargo.toml b/zellij-utils/Cargo.toml
index efd07f54f..3aefa684d 100644
--- a/zellij-utils/Cargo.toml
+++ b/zellij-utils/Cargo.toml
@@ -12,6 +12,8 @@ license = "MIT"
anyhow = "1.0.45"
backtrace = "0.3.55"
bincode = "1.3.1"
+clap = { version = "3.0", features = ["derive", "env"] }
+clap_complete = "3.0"
colored = "2.0.0"
colorsys = "0.6.5"
crossbeam = "0.8.0"
@@ -26,7 +28,6 @@ serde_yaml = "0.8"
serde_json = "1.0"
signal-hook = "0.3"
strip-ansi-escapes = "0.1.0"
-structopt = "0.3"
strum = "0.20.0"
termion = "1.5.0"
thiserror = "1.0.30"
diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs
index 2c1aeba37..03bf8db4d 100644
--- a/zellij-utils/src/cli.rs
+++ b/zellij-utils/src/cli.rs
@@ -3,111 +3,111 @@ use crate::{
consts::{ZELLIJ_CONFIG_DIR_ENV, ZELLIJ_CONFIG_FILE_ENV},
input::options::CliOptions,
};
+use clap::{Parser, Subcommand};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
-use structopt::StructOpt;
-#[derive(StructOpt, Default, Debug, Clone, Serialize, Deserialize)]
-#[structopt(name = "zellij")]
+#[derive(Parser, Default, Debug, Clone, Serialize, Deserialize)]
+#[clap(version, name = "zellij")]
pub struct CliArgs {
/// Maximum panes on screen, caution: opening more panes will close old ones
- #[structopt(long)]
+ #[clap(long)]
pub max_panes: Option<usize>,
/// Change where zellij looks for layouts and plugins
- #[structopt(long, parse(from_os_str))]
+ #[clap(long, parse(from_os_str))]
pub data_dir: Option<PathBuf>,
/// Run server listening at the specified socket path
- #[structopt(long, parse(from_os_str), hidden = true)]
+ #[clap(long, parse(from_os_str), hide = true)]
pub server: Option<PathBuf>,
/// Specify name of a new session
- #[structopt(long, short)]
+ #[clap(long, short)]
pub session: Option<String>,
/// Name of a layout file in the layout directory
- #[structopt(short, long, parse(from_os_str))]
+ #[clap(short, long, parse(from_os_str))]
pub layout: Option<PathBuf>,
/// Path to a layout yaml file
- #[structopt(long, parse(from_os_str))]
+ #[clap(long, parse(from_os_str))]
pub layout_path: Option<PathBuf>,
/// Change where zellij looks for the configuration file
- #[structopt(short, long, env=ZELLIJ_CONFIG_FILE_ENV, parse(from_os_str))]
+ #[clap(short, long, env = ZELLIJ_CONFIG_FILE_ENV, parse(from_os_str))]
pub config: Option<PathBuf>,
/// Change where zellij looks for the configuration directory
- #[structopt(long, env=ZELLIJ_CONFIG_DIR_ENV, parse(from_os_str))]
+ #[clap(long, env = ZELLIJ_CONFIG_DIR_ENV, parse(from_os_str))]
pub config_dir: Option<PathBuf>,
- #[structopt(subcommand)]
+ #[clap(subcommand)]
pub command: Option<Command>,
- #[structopt(short, long)]
+ #[clap(short, long)]
pub debug: bool,
}
-#[derive(Debug, StructOpt, Clone, Serialize, Deserialize)]
+#[derive(Debug, Subcommand, Clone, Serialize, Deserialize)]
pub enum Command {
/// Change the behaviour of zellij
- #[structopt(name = "options")]
+ #[clap(name = "options")]
Options(CliOptions),
/// Setup zellij and check its configuration
- #[structopt(name = "setup")]
+ #[clap(name = "setup")]
Setup(Setup),
/// Explore existing zellij sessions
- #[structopt(flatten)]
+ #[clap(flatten)]
Sessions(Sessions),
}
-#[derive(Debug, StructOpt, Clone, Serialize, Deserialize)]
+#[derive(Debug, Subcommand, Clone, Serialize, Deserialize)]
pub enum SessionCommand {
/// Change the behaviour of zellij
- #[structopt(name = "options")]
+ #[clap(name = "options")]
Options(CliOptions),
}
-#[derive(Debug, StructOpt, Clone, Serialize, Deserialize)]
+#[derive(Debug, Subcommand, Clone, Serialize, Deserialize)]
pub enum Sessions {
/// List active sessions
- #[structopt(alias = "ls")]
+ #[clap(alias = "ls")]
ListSessions,
/// Attach to session
- #[structopt(alias = "a")]
+ #[clap(alias = "a")]
Attach {
/// Name of the session to attach to.
session_name: Option<String>,
/// Create a session if one does not exist.
- #[structopt(short, long)]
+ #[clap(short, long)]
create: bool,
/// Number of the session index in the active sessions ordered creation date.
- #[structopt(long)]
+ #[clap(long)]
index: Option<usize>,
/// Change the behaviour of zellij
- #[structopt(subcommand, name = "options")]
+ #[clap(subcommand, name = "options")]
options: Option<SessionCommand>,
},
/// Kill the specific session
- #[structopt(alias = "k")]
+ #[clap(alias = "k")]
KillSession {
/// Name of target session
target_session: Option<String>,
},
/// Kill all sessions
- #[structopt(alias = "ka")]
+ #[clap(alias = "ka")]
KillAllSessions {
/// Automatic yes to prompts
- #[structopt(short, long)]
+ #[clap(short, long)]
yes: bool,
},
}
diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs
index d8bef694b..41f241f69 100644
--- a/zellij-utils/src/input/options.rs
+++ b/zellij-utils/src/input/options.rs
@@ -1,12 +1,12 @@
//! Handles cli and configuration options
use crate::cli::Command;
+use clap::{ArgEnum, Args};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use std::str::FromStr;
-use structopt::StructOpt;
use zellij_tile::data::InputMode;
-#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize)]
+#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, ArgEnum)]
pub enum OnForceClose {
#[serde(alias = "quit")]
Quit,
@@ -32,7 +32,7 @@ impl FromStr for OnForceClose {
}
}
-#[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize, StructOpt)]
+#[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize, Args)]
/// Options that can be set either through the config file,
/// or cli flags - cli flags should take precedence over the config file
/// TODO: In order to correctly parse boolean flags, this is currently split
@@ -40,43 +40,43 @@ impl FromStr for OnForceClose {
pub struct Options {
/// Allow plugins to use a more simplified layout
/// that is compatible with more fonts (true or false)
- #[structopt(long)]
+ #[clap(long)]
#[serde(default)]
pub simplified_ui: Option<bool>,
/// Set the default theme
- #[structopt(long)]
+ #[clap(long)]
pub theme: Option<String>,
/// Set the default mode
- #[structopt(long)]
+ #[clap(long, arg_enum, hide_possible_values = true)]
pub default_mode: Option<InputMode>,
/// Set the default shell
- #[structopt(long, parse(from_os_str))]
+ #[clap(long, parse(from_os_str))]
pub default_shell: Option<PathBuf>,
/// Set the layout_dir, defaults to
/// subdirectory of config dir
- #[structopt(long, parse(from_os_str))]
+ #[clap(long, parse(from_os_str))]
pub layout_dir: Option<PathBuf>,
- #[structopt(long)]
+ #[clap(long)]
#[serde(default)]
/// Set the handling of mouse events (true or false)
/// Can be temporarily bypassed by the [SHIFT] key
pub mouse_mode: Option<bool>,
- #[structopt(long)]
+ #[clap(long)]
#[serde(default)]
/// Set display of the pane frames (true or false)
pub pane_frames: Option<bool>,
- #[structopt(long)]
+ #[clap(long)]
#[serde(default)]
/// Mirror session when multiple users are connected (true or false)
pub mirror_session: Option<bool>,
/// Set behaviour on force close (quit or detach)
- #[structopt(long)]
+ #[clap(long, arg_enum, hide_possible_values = true)]
pub on_force_close: Option<OnForceClose>,
- #[structopt(long)]
+ #[clap(long)]
pub scroll_buffer_size: Option<usize>,
/// Switch to using a user supplied command for clipboard instead of OSC52
- #[structopt(long)]
+ #[clap(long)]
#[serde(default)]
pub copy_command: Option<String>,
}
@@ -173,17 +173,17 @@ impl Options {
}
}
-#[derive(Clone, Default, Debug, PartialEq, StructOpt, Serialize, Deserialize)]
+#[derive(Clone, Default, Debug, PartialEq, Args, Serialize, Deserialize)]
/// Options that can be set through cli flags
/// boolean flags end up toggling boolean options in `Options`
pub struct CliOptions {
/// Disable handling of mouse events
- #[structopt(long, conflicts_with("mouse-mode"))]
+ #[clap(long, conflicts_with("mouse-mode"))]
pub disable_mouse_mode: bool,
/// Disable display of pane frames
- #[structopt(long, conflicts_with("pane-frames"))]
+ #[clap(long, conflicts_with("pane-frames"))]
pub no_pane_frames: bool,
- #[structopt(flatten)]
+ #[clap(flatten)]
options: Options,
}
diff --git a/zellij-utils/src/lib.rs b/zellij-utils/src/lib.rs
index 4ccb25f5e..7115c1b46 100644
--- a/zellij-utils/src/lib.rs
+++ b/zellij-utils/src/lib.rs
@@ -12,13 +12,13 @@ pub mod setup;
pub mod shared;
pub use async_std;
+pub use clap;
pub use interprocess;
pub use libc;
pub use nix;
pub use serde;
pub use serde_yaml;
pub use signal_hook;
-pub use structopt;
pub use termion;
pub use vte;
pub use zellij_tile;
diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs
index 0de857249..565e72c9d 100644
--- a/zellij-utils/src/setup.rs
+++ b/zellij-utils/src/setup.rs
@@ -10,12 +10,13 @@ use crate::{
options::Options,
},
};
+use clap::{Args, IntoApp};
+use clap_complete::Shell;
use directories_next::BaseDirs;
use serde::{Deserialize, Serialize};
use std::{
convert::TryFrom, fmt::Write as FmtWrite, io::Write, path::Path, path::PathBuf, process,
};
-use structopt::StructOpt;
const CONFIG_LOCATION: &str = ".config/zellij";
const CONFIG_NAME: &str = "config.yaml";
@@ -124,25 +125,25 @@ pub fn dump_specified_layout(layout: &str) -> std::io::Result<()> {
}
}
-#[derive(Debug, Default, Clone, StructOpt, Serialize, Deserialize)]
+#[derive(Debug, Default, Clone, Args, Serialize, Deserialize)]
pub struct Setup {
/// Dump the default configuration file to stdout
- #[structopt(long)]
+ #[clap(long)]
pub dump_config: bool,
/// Disables loading of configuration file at default location,
/// loads the defaults that zellij ships with
- #[structopt(long)]
+ #[clap(long)]
pub clean: bool,
/// Checks the configuration of zellij and displays
/// currently used directories
- #[structopt(long)]
+ #[clap(long)]
pub check: bool,
/// Dump the specified layout file to stdout
- #[structopt(long)]
+ #[clap(long)]
pub dump_layout: Option<String>,
/// Generates completion for the specified shell
- #[structopt(long)]
+ #[clap(long, value_name = "SHELL")]
pub generate_completion: Option<String>,
}
@@ -231,7 +232,7 @@ impl Setup {
}
if let Some(shell) = &self.generate_completion {
- Self::generate_completion(shell.into());
+ Self::generate_completion(shell);
std::process::exit(0);
}
@@ -376,8 +377,8 @@ impl Setup {
Ok(())
}
- fn generate_completion(shell: String) {
- let shell = match shell.parse() {
+ fn generate_completion(shell: &str) {
+ let shell: Shell = match shell.to_lowercase().parse() {
Ok(shell) => shell,
_ => {
eprintln!("Unsupported shell: {}", shell);
@@ -385,7 +386,7 @@ impl Setup {
}
};
let mut out = std::io::stdout();
- CliArgs::clap().gen_completions_to("zellij", shell, &mut out);
+ clap_complete::generate(shell, &mut CliArgs::into_app(), "zellij", &mut out);
}
}