summaryrefslogtreecommitdiffstats
path: root/src/key_command/impl_from_str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/key_command/impl_from_str.rs')
-rw-r--r--src/key_command/impl_from_str.rs101
1 files changed, 67 insertions, 34 deletions
diff --git a/src/key_command/impl_from_str.rs b/src/key_command/impl_from_str.rs
index 9507305..c84bc1b 100644
--- a/src/key_command/impl_from_str.rs
+++ b/src/key_command/impl_from_str.rs
@@ -26,7 +26,10 @@ impl std::str::FromStr for Command {
fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Some(stripped) = s.strip_prefix(':') {
- return Ok(Self::CommandLine(stripped.to_owned(), "".to_owned()));
+ return Ok(Self::CommandLine {
+ prefix: stripped.to_owned(),
+ suffix: "".to_owned(),
+ });
}
let (command, arg) = match s.find(' ') {
@@ -68,7 +71,6 @@ impl std::str::FromStr for Command {
);
simple_command_conversion_case!(command, CMD_COPY_FILEPATH, Self::CopyFilePath);
simple_command_conversion_case!(command, CMD_COPY_DIRECTORY_PATH, Self::CopyDirPath);
- simple_command_conversion_case!(command, CMD_SYMLINK_FILES, Self::SymlinkFiles);
simple_command_conversion_case!(command, CMD_OPEN_FILE, Self::OpenFile);
@@ -97,7 +99,7 @@ impl std::str::FromStr for Command {
} else if command == CMD_CHANGE_DIRECTORY {
match arg {
"" => match HOME_DIR.as_ref() {
- Some(s) => Ok(Self::ChangeDirectory(s.clone())),
+ Some(s) => Ok(Self::ChangeDirectory { path: s.clone() }),
None => Err(JoshutoError::new(
JoshutoErrorKind::EnvVarNotPresent,
format!("{}: Cannot find home directory", command),
@@ -105,16 +107,17 @@ impl std::str::FromStr for Command {
},
".." => Ok(Self::ParentDirectory),
"-" => Ok(Self::PreviousDirectory),
- arg => Ok({
+ arg => {
let path_accepts_tilde = tilde_with_context(arg, home_dir);
- Self::ChangeDirectory(path::PathBuf::from(path_accepts_tilde.as_ref()))
- }),
+ let path = path::PathBuf::from(path_accepts_tilde.as_ref());
+ Ok(Self::ChangeDirectory { path })
+ }
}
} else if command == CMD_CURSOR_MOVE_DOWN {
match arg {
- "" => Ok(Self::CursorMoveDown(1)),
+ "" => Ok(Self::CursorMoveDown { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::CursorMoveDown(s)),
+ Ok(s) => Ok(Self::CursorMoveDown { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -129,9 +132,9 @@ impl std::str::FromStr for Command {
Ok(Self::CursorMovePageDown(p))
} else if command == CMD_CURSOR_MOVE_UP {
match arg {
- "" => Ok(Self::CursorMoveUp(1)),
+ "" => Ok(Self::CursorMoveUp { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::CursorMoveUp(s)),
+ Ok(s) => Ok(Self::CursorMoveUp { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -140,9 +143,9 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_PARENT_CURSOR_MOVE_DOWN {
match arg {
- "" => Ok(Self::ParentCursorMoveDown(1)),
+ "" => Ok(Self::ParentCursorMoveDown { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::ParentCursorMoveDown(s)),
+ Ok(s) => Ok(Self::ParentCursorMoveDown { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -151,9 +154,9 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_PARENT_CURSOR_MOVE_UP {
match arg {
- "" => Ok(Self::ParentCursorMoveUp(1)),
+ "" => Ok(Self::ParentCursorMoveUp { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::ParentCursorMoveUp(s)),
+ Ok(s) => Ok(Self::ParentCursorMoveUp { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -162,9 +165,9 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_PREVIEW_CURSOR_MOVE_DOWN {
match arg {
- "" => Ok(Self::PreviewCursorMoveDown(1)),
+ "" => Ok(Self::PreviewCursorMoveDown { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::PreviewCursorMoveDown(s)),
+ Ok(s) => Ok(Self::PreviewCursorMoveDown { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -173,9 +176,9 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_PREVIEW_CURSOR_MOVE_UP {
match arg {
- "" => Ok(Self::PreviewCursorMoveUp(1)),
+ "" => Ok(Self::PreviewCursorMoveUp { offset: 1 }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::PreviewCursorMoveUp(s)),
+ Ok(s) => Ok(Self::PreviewCursorMoveUp { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
@@ -189,19 +192,35 @@ impl std::str::FromStr for Command {
format!("{}: no directory name given", command),
))
} else {
- Ok(Self::NewDirectory(path::PathBuf::from(arg)))
+ let path = path::PathBuf::from(arg);
+ Ok(Self::NewDirectory { path })
}
} else if command == CMD_OPEN_FILE_WITH {
match arg {
- "" => Ok(Self::OpenFileWith(None)),
+ "" => Ok(Self::OpenFileWith { index: None }),
arg => match arg.trim().parse::<usize>() {
- Ok(s) => Ok(Self::OpenFileWith(Some(s))),
+ Ok(s) => Ok(Self::OpenFileWith { index: Some(s) }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::ParseError,
e.to_string(),
)),
},
}
+ } else if command == CMD_SYMLINK_FILES {
+ let mut relative = false;
+ for arg in arg.split_whitespace() {
+ match arg {
+ "--relative=true" => relative = true,
+ "--relative=false" => relative = false,
+ _ => {
+ return Err(JoshutoError::new(
+ JoshutoErrorKind::UnrecognizedArgument,
+ format!("{}: unknown option '{}'", command, arg),
+ ));
+ }
+ }
+ }
+ Ok(Self::SymlinkFiles { relative })
} else if command == CMD_PASTE_FILES {
let mut options = FileOperationOptions::default();
for arg in arg.split_whitespace() {
@@ -218,7 +237,7 @@ impl std::str::FromStr for Command {
}
}
}
- Ok(Self::PasteFiles(options))
+ Ok(Self::PasteFiles { options })
} else if command == CMD_DELETE_FILES {
match arg {
"--foreground=true" => Ok(Self::DeleteFiles { background: true }),
@@ -236,7 +255,7 @@ impl std::str::FromStr for Command {
)),
arg => {
let path: path::PathBuf = path::PathBuf::from(arg);
- Ok(Self::RenameFile(path))
+ Ok(Self::RenameFile { new_name: path })
}
}
} else if command == CMD_SEARCH_STRING {
@@ -245,17 +264,23 @@ impl std::str::FromStr for Command {
JoshutoErrorKind::InvalidParameters,
format!("{}: Expected 1, got 0", command),
)),
- arg => Ok(Self::SearchString(arg.to_string())),
+ arg => Ok(Self::SearchString {
+ pattern: arg.to_string(),
+ }),
}
} else if command == CMD_SEARCH_INCREMENTAL {
- Ok(Self::SearchIncremental(arg.to_string()))
+ Ok(Self::SearchIncremental {
+ pattern: arg.to_string(),
+ })
} else if command == CMD_SEARCH_GLOB {
match arg {
"" => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: Expected 1, got 0", command),
)),
- arg => Ok(Self::SearchGlob(arg.to_string())),
+ arg => Ok(Self::SearchGlob {
+ pattern: arg.to_string(),
+ }),
}
} else if command == CMD_SELECT_FILES {
let mut options = SelectOption::default();
@@ -273,7 +298,10 @@ impl std::str::FromStr for Command {
s => pattern = s,
}
}
- Ok(Self::SelectFiles(pattern.to_string(), options))
+ Ok(Self::SelectFiles {
+ pattern: pattern.to_string(),
+ options,
+ })
}
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
@@ -282,7 +310,10 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_SUBPROCESS_FOREGROUND || command == CMD_SUBPROCESS_BACKGROUND {
match shell_words::split(arg) {
- Ok(s) if !s.is_empty() => Ok(Self::SubProcess(s, command == "spawn")),
+ Ok(s) if !s.is_empty() => Ok(Self::SubProcess {
+ words: s,
+ spawn: command == "spawn",
+ }),
Ok(_) => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: No commands given", command),
@@ -305,22 +336,24 @@ impl std::str::FromStr for Command {
}
} else if command == CMD_TAB_SWITCH {
match arg.parse::<i32>() {
- Ok(s) => Ok(Self::TabSwitch(s)),
+ Ok(s) => Ok(Self::TabSwitch { offset: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: {}", command, e),
)),
}
} else if command == CMD_TAB_SWITCH_INDEX {
- match arg.parse::<u32>() {
- Ok(s) => Ok(Self::TabSwitchIndex(s)),
+ match arg.parse::<usize>() {
+ Ok(s) => Ok(Self::TabSwitchIndex { index: s }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: {}", command, e),
)),
}
} else if command == CMD_TOUCH_FILE {
- Ok(Self::TouchFile(arg.to_string()))
+ Ok(Self::TouchFile {
+ file_name: arg.to_string(),
+ })
} else if command == CMD_SWITCH_LINE_NUMBERS {
let policy = match arg {
"absolute" | "1" => LineNumberStyle::Absolute,
@@ -330,7 +363,7 @@ impl std::str::FromStr for Command {
Ok(Self::SwitchLineNums(policy))
} else if command == CMD_FLAT {
match arg.parse::<usize>() {
- Ok(i) => Ok(Self::Flat(i + 1)),
+ Ok(i) => Ok(Self::Flat { depth: i + 1 }),
Err(e) => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: {}", command, e),
@@ -339,7 +372,7 @@ impl std::str::FromStr for Command {
} else if command == CMD_NUMBERED_COMMAND {
let c = arg.chars().next();
match c {
- Some(c) => Ok(Self::NumberedCommand(c)),
+ Some(c) => Ok(Self::NumberedCommand { initial: c }),
None => Err(JoshutoError::new(
JoshutoErrorKind::InvalidParameters,
format!("{}: no starting character given", command),