|
| 1 | +use anyhow::Result; |
| 2 | +use crossterm::event::KeyEvent; |
| 3 | +use ron::{self}; |
| 4 | +use serde::{Deserialize, Serialize}; |
| 5 | +use std::{fs::File, io::Read, path::PathBuf}; |
| 6 | + |
| 7 | +use super::key_list::KeysList; |
| 8 | + |
| 9 | +#[derive(Serialize, Deserialize, Default)] |
| 10 | +pub struct KeysListFile { |
| 11 | + pub tab_status: Option<KeyEvent>, |
| 12 | + pub tab_log: Option<KeyEvent>, |
| 13 | + pub tab_files: Option<KeyEvent>, |
| 14 | + pub tab_stashing: Option<KeyEvent>, |
| 15 | + pub tab_stashes: Option<KeyEvent>, |
| 16 | + pub tab_toggle: Option<KeyEvent>, |
| 17 | + pub tab_toggle_reverse: Option<KeyEvent>, |
| 18 | + pub toggle_workarea: Option<KeyEvent>, |
| 19 | + pub focus_right: Option<KeyEvent>, |
| 20 | + pub focus_left: Option<KeyEvent>, |
| 21 | + pub focus_above: Option<KeyEvent>, |
| 22 | + pub focus_below: Option<KeyEvent>, |
| 23 | + pub exit: Option<KeyEvent>, |
| 24 | + pub quit: Option<KeyEvent>, |
| 25 | + pub exit_popup: Option<KeyEvent>, |
| 26 | + pub open_commit: Option<KeyEvent>, |
| 27 | + pub open_commit_editor: Option<KeyEvent>, |
| 28 | + pub open_help: Option<KeyEvent>, |
| 29 | + pub open_options: Option<KeyEvent>, |
| 30 | + pub move_left: Option<KeyEvent>, |
| 31 | + pub move_right: Option<KeyEvent>, |
| 32 | + pub tree_collapse_recursive: Option<KeyEvent>, |
| 33 | + pub tree_expand_recursive: Option<KeyEvent>, |
| 34 | + pub home: Option<KeyEvent>, |
| 35 | + pub end: Option<KeyEvent>, |
| 36 | + pub move_up: Option<KeyEvent>, |
| 37 | + pub move_down: Option<KeyEvent>, |
| 38 | + pub popup_up: Option<KeyEvent>, |
| 39 | + pub popup_down: Option<KeyEvent>, |
| 40 | + pub page_down: Option<KeyEvent>, |
| 41 | + pub page_up: Option<KeyEvent>, |
| 42 | + pub shift_up: Option<KeyEvent>, |
| 43 | + pub shift_down: Option<KeyEvent>, |
| 44 | + pub enter: Option<KeyEvent>, |
| 45 | + pub blame: Option<KeyEvent>, |
| 46 | + pub edit_file: Option<KeyEvent>, |
| 47 | + pub status_stage_all: Option<KeyEvent>, |
| 48 | + pub status_reset_item: Option<KeyEvent>, |
| 49 | + pub status_ignore_file: Option<KeyEvent>, |
| 50 | + pub diff_stage_lines: Option<KeyEvent>, |
| 51 | + pub diff_reset_lines: Option<KeyEvent>, |
| 52 | + pub stashing_save: Option<KeyEvent>, |
| 53 | + pub stashing_toggle_untracked: Option<KeyEvent>, |
| 54 | + pub stashing_toggle_index: Option<KeyEvent>, |
| 55 | + pub stash_apply: Option<KeyEvent>, |
| 56 | + pub stash_open: Option<KeyEvent>, |
| 57 | + pub stash_drop: Option<KeyEvent>, |
| 58 | + pub cmd_bar_toggle: Option<KeyEvent>, |
| 59 | + pub log_tag_commit: Option<KeyEvent>, |
| 60 | + pub log_mark_commit: Option<KeyEvent>, |
| 61 | + pub commit_amend: Option<KeyEvent>, |
| 62 | + pub copy: Option<KeyEvent>, |
| 63 | + pub create_branch: Option<KeyEvent>, |
| 64 | + pub rename_branch: Option<KeyEvent>, |
| 65 | + pub select_branch: Option<KeyEvent>, |
| 66 | + pub delete_branch: Option<KeyEvent>, |
| 67 | + pub merge_branch: Option<KeyEvent>, |
| 68 | + pub rebase_branch: Option<KeyEvent>, |
| 69 | + pub compare_commits: Option<KeyEvent>, |
| 70 | + pub tags: Option<KeyEvent>, |
| 71 | + pub delete_tag: Option<KeyEvent>, |
| 72 | + pub select_tag: Option<KeyEvent>, |
| 73 | + pub push: Option<KeyEvent>, |
| 74 | + pub open_file_tree: Option<KeyEvent>, |
| 75 | + pub file_find: Option<KeyEvent>, |
| 76 | + pub force_push: Option<KeyEvent>, |
| 77 | + pub pull: Option<KeyEvent>, |
| 78 | + pub abort_merge: Option<KeyEvent>, |
| 79 | + pub undo_commit: Option<KeyEvent>, |
| 80 | + pub stage_unstage_item: Option<KeyEvent>, |
| 81 | +} |
| 82 | + |
| 83 | +impl KeysListFile { |
| 84 | + #[allow(dead_code)] |
| 85 | + pub fn read_file(config_file: PathBuf) -> Result<Self> { |
| 86 | + let mut f = File::open(config_file)?; |
| 87 | + let mut buffer = Vec::new(); |
| 88 | + f.read_to_end(&mut buffer)?; |
| 89 | + Ok(ron::de::from_bytes(&buffer)?) |
| 90 | + } |
| 91 | + |
| 92 | + #[rustfmt::skip] |
| 93 | + pub fn get_list(self) -> KeysList { |
| 94 | + let default = KeysList::default(); |
| 95 | + |
| 96 | + KeysList { |
| 97 | + tab_status: self.tab_status.unwrap_or(default.tab_status), |
| 98 | + tab_log: self.tab_log.unwrap_or(default.tab_log), |
| 99 | + tab_files: self.tab_files.unwrap_or(default.tab_files), |
| 100 | + tab_stashing: self.tab_stashing.unwrap_or(default.tab_stashing), |
| 101 | + tab_stashes: self.tab_stashes.unwrap_or(default.tab_stashes), |
| 102 | + tab_toggle: self.tab_toggle.unwrap_or(default.tab_toggle), |
| 103 | + tab_toggle_reverse: self.tab_toggle_reverse.unwrap_or(default.tab_toggle_reverse), |
| 104 | + toggle_workarea: self.toggle_workarea.unwrap_or(default.toggle_workarea), |
| 105 | + focus_right: self.focus_right.unwrap_or(default.focus_right), |
| 106 | + focus_left: self.focus_left.unwrap_or(default.focus_left), |
| 107 | + focus_above: self.focus_above.unwrap_or(default.focus_above), |
| 108 | + focus_below: self.focus_below.unwrap_or(default.focus_below), |
| 109 | + exit: self.exit.unwrap_or(default.exit), |
| 110 | + quit: self.quit.unwrap_or(default.quit), |
| 111 | + exit_popup: self.exit_popup.unwrap_or(default.exit_popup), |
| 112 | + open_commit: self.open_commit.unwrap_or(default.open_commit), |
| 113 | + open_commit_editor: self.open_commit_editor.unwrap_or(default.open_commit_editor), |
| 114 | + open_help: self.open_help.unwrap_or(default.open_help), |
| 115 | + open_options: self.open_options.unwrap_or(default.open_options), |
| 116 | + move_left: self.move_left.unwrap_or(default.move_left), |
| 117 | + move_right: self.move_right.unwrap_or(default.move_right), |
| 118 | + tree_collapse_recursive: self.tree_collapse_recursive.unwrap_or(default.tree_collapse_recursive), |
| 119 | + tree_expand_recursive: self.tree_expand_recursive.unwrap_or(default.tree_expand_recursive), |
| 120 | + home: self.home.unwrap_or(default.home), |
| 121 | + end: self.end.unwrap_or(default.end), |
| 122 | + move_up: self.move_up.unwrap_or(default.move_up), |
| 123 | + move_down: self.move_down.unwrap_or(default.move_down), |
| 124 | + popup_up: self.popup_up.unwrap_or(default.popup_up), |
| 125 | + popup_down: self.popup_down.unwrap_or(default.popup_down), |
| 126 | + page_down: self.page_down.unwrap_or(default.page_down), |
| 127 | + page_up: self.page_up.unwrap_or(default.page_up), |
| 128 | + shift_up: self.shift_up.unwrap_or(default.shift_up), |
| 129 | + shift_down: self.shift_down.unwrap_or(default.shift_down), |
| 130 | + enter: self.enter.unwrap_or(default.enter), |
| 131 | + blame: self.blame.unwrap_or(default.blame), |
| 132 | + edit_file: self.edit_file.unwrap_or(default.edit_file), |
| 133 | + status_stage_all: self.status_stage_all.unwrap_or(default.status_stage_all), |
| 134 | + status_reset_item: self.status_reset_item.unwrap_or(default.status_reset_item), |
| 135 | + status_ignore_file: self.status_ignore_file.unwrap_or(default.status_ignore_file), |
| 136 | + diff_stage_lines: self.diff_stage_lines.unwrap_or(default.diff_stage_lines), |
| 137 | + diff_reset_lines: self.diff_reset_lines.unwrap_or(default.diff_reset_lines), |
| 138 | + stashing_save: self.stashing_save.unwrap_or(default.stashing_save), |
| 139 | + stashing_toggle_untracked: self.stashing_toggle_untracked.unwrap_or(default.stashing_toggle_untracked), |
| 140 | + stashing_toggle_index: self.stashing_toggle_index.unwrap_or(default.stashing_toggle_index), |
| 141 | + stash_apply: self.stash_apply.unwrap_or(default.stash_apply), |
| 142 | + stash_open: self.stash_open.unwrap_or(default.stash_open), |
| 143 | + stash_drop: self.stash_drop.unwrap_or(default.stash_drop), |
| 144 | + cmd_bar_toggle: self.cmd_bar_toggle.unwrap_or(default.cmd_bar_toggle), |
| 145 | + log_tag_commit: self.log_tag_commit.unwrap_or(default.log_tag_commit), |
| 146 | + log_mark_commit: self.log_mark_commit.unwrap_or(default.log_mark_commit), |
| 147 | + commit_amend: self.commit_amend.unwrap_or(default.commit_amend), |
| 148 | + copy: self.copy.unwrap_or(default.copy), |
| 149 | + create_branch: self.create_branch.unwrap_or(default.create_branch), |
| 150 | + rename_branch: self.rename_branch.unwrap_or(default.rename_branch), |
| 151 | + select_branch: self.select_branch.unwrap_or(default.select_branch), |
| 152 | + delete_branch: self.delete_branch.unwrap_or(default.delete_branch), |
| 153 | + merge_branch: self.merge_branch.unwrap_or(default.merge_branch), |
| 154 | + rebase_branch: self.rebase_branch.unwrap_or(default.rebase_branch), |
| 155 | + compare_commits: self.compare_commits.unwrap_or(default.compare_commits), |
| 156 | + tags: self.tags.unwrap_or(default.tags), |
| 157 | + delete_tag: self.delete_tag.unwrap_or(default.delete_tag), |
| 158 | + select_tag: self.select_tag.unwrap_or(default.select_tag), |
| 159 | + push: self.push.unwrap_or(default.push), |
| 160 | + open_file_tree: self.open_file_tree.unwrap_or(default.open_file_tree), |
| 161 | + file_find: self.file_find.unwrap_or(default.file_find), |
| 162 | + force_push: self.force_push.unwrap_or(default.force_push), |
| 163 | + pull: self.pull.unwrap_or(default.pull), |
| 164 | + abort_merge: self.abort_merge.unwrap_or(default.abort_merge), |
| 165 | + undo_commit: self.undo_commit.unwrap_or(default.undo_commit), |
| 166 | + stage_unstage_item: self.stage_unstage_item.unwrap_or(default.stage_unstage_item), |
| 167 | + } |
| 168 | + } |
| 169 | +} |
| 170 | + |
| 171 | +#[cfg(test)] |
| 172 | +mod tests { |
| 173 | + use super::*; |
| 174 | + |
| 175 | + #[test] |
| 176 | + fn test_load_vim_style_example() { |
| 177 | + assert_eq!( |
| 178 | + KeysListFile::read_file( |
| 179 | + "vim_style_key_config.ron".into() |
| 180 | + ) |
| 181 | + .is_ok(), |
| 182 | + true |
| 183 | + ); |
| 184 | + } |
| 185 | +} |
0 commit comments