mirror of
https://github.com/sayanarijit/xplr.git
synced 2024-09-11 11:05:39 +03:00
Make internals private
This commit is contained in:
parent
33e500a16d
commit
f38398e900
308
src/app.rs
308
src/app.rs
@ -20,15 +20,15 @@ pub const UPGRADE_GUIDE_LINK: &str = "https://github.com/sayanarijit/xplr/wiki/U
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct Pipe {
|
||||
pub msg_in: String,
|
||||
pub focus_out: String,
|
||||
pub selection_out: String,
|
||||
pub result_out: String,
|
||||
pub mode_out: String,
|
||||
pub directory_nodes_out: String,
|
||||
pub global_help_menu_out: String,
|
||||
pub logs_out: String,
|
||||
pub history_out: String,
|
||||
msg_in: String,
|
||||
focus_out: String,
|
||||
selection_out: String,
|
||||
result_out: String,
|
||||
mode_out: String,
|
||||
directory_nodes_out: String,
|
||||
global_help_menu_out: String,
|
||||
logs_out: String,
|
||||
history_out: String,
|
||||
}
|
||||
|
||||
impl Pipe {
|
||||
@ -83,17 +83,62 @@ impl Pipe {
|
||||
history_out,
|
||||
})
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's msg in.
|
||||
pub fn msg_in(&self) -> &String {
|
||||
&self.msg_in
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's focus out.
|
||||
pub fn focus_out(&self) -> &String {
|
||||
&self.focus_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's selection out.
|
||||
pub fn selection_out(&self) -> &String {
|
||||
&self.selection_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's result out.
|
||||
pub fn result_out(&self) -> &String {
|
||||
&self.result_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's mode out.
|
||||
pub fn mode_out(&self) -> &String {
|
||||
&self.mode_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's directory nodes out.
|
||||
pub fn directory_nodes_out(&self) -> &String {
|
||||
&self.directory_nodes_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's global help menu out.
|
||||
pub fn global_help_menu_out(&self) -> &String {
|
||||
&self.global_help_menu_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's logs out.
|
||||
pub fn logs_out(&self) -> &String {
|
||||
&self.logs_out
|
||||
}
|
||||
|
||||
/// Get a reference to the pipe's history out.
|
||||
pub fn history_out(&self) -> &String {
|
||||
&self.history_out
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct ResolvedNode {
|
||||
pub absolute_path: String,
|
||||
pub extension: String,
|
||||
pub is_dir: bool,
|
||||
pub is_file: bool,
|
||||
pub is_readonly: bool,
|
||||
pub mime_essence: String,
|
||||
pub size: u64,
|
||||
absolute_path: String,
|
||||
extension: String,
|
||||
is_dir: bool,
|
||||
is_file: bool,
|
||||
is_readonly: bool,
|
||||
mime_essence: String,
|
||||
size: u64,
|
||||
}
|
||||
|
||||
impl ResolvedNode {
|
||||
@ -123,23 +168,58 @@ impl ResolvedNode {
|
||||
size,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's absolute path.
|
||||
pub fn absolute_path(&self) -> &String {
|
||||
&self.absolute_path
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's extension.
|
||||
pub fn extension(&self) -> &String {
|
||||
&self.extension
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's is dir.
|
||||
pub fn is_dir(&self) -> bool {
|
||||
self.is_dir
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's is file.
|
||||
pub fn is_file(&self) -> bool {
|
||||
self.is_file
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's is readonly.
|
||||
pub fn is_readonly(&self) -> bool {
|
||||
self.is_readonly
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's mime essence.
|
||||
pub fn mime_essence(&self) -> &String {
|
||||
&self.mime_essence
|
||||
}
|
||||
|
||||
/// Get a reference to the resolved node's size.
|
||||
pub fn size(&self) -> u64 {
|
||||
self.size
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Node {
|
||||
pub parent: String,
|
||||
pub relative_path: String,
|
||||
pub absolute_path: String,
|
||||
pub extension: String,
|
||||
pub is_dir: bool,
|
||||
pub is_file: bool,
|
||||
pub is_symlink: bool,
|
||||
pub is_broken: bool,
|
||||
pub is_readonly: bool,
|
||||
pub mime_essence: String,
|
||||
pub size: u64,
|
||||
pub canonical: Option<ResolvedNode>,
|
||||
pub symlink: Option<ResolvedNode>,
|
||||
parent: String,
|
||||
relative_path: String,
|
||||
absolute_path: String,
|
||||
extension: String,
|
||||
is_dir: bool,
|
||||
is_file: bool,
|
||||
is_symlink: bool,
|
||||
is_broken: bool,
|
||||
is_readonly: bool,
|
||||
mime_essence: String,
|
||||
size: u64,
|
||||
canonical: Option<ResolvedNode>,
|
||||
symlink: Option<ResolvedNode>,
|
||||
}
|
||||
|
||||
impl Node {
|
||||
@ -199,6 +279,71 @@ impl Node {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a reference to the node's parent.
|
||||
pub fn parent(&self) -> &String {
|
||||
&self.parent
|
||||
}
|
||||
|
||||
/// Get a reference to the node's relative path.
|
||||
pub fn relative_path(&self) -> &String {
|
||||
&self.relative_path
|
||||
}
|
||||
|
||||
/// Get a reference to the node's extension.
|
||||
pub fn extension(&self) -> &String {
|
||||
&self.extension
|
||||
}
|
||||
|
||||
/// Get a reference to the node's is dir.
|
||||
pub fn is_dir(&self) -> bool {
|
||||
self.is_dir
|
||||
}
|
||||
|
||||
/// Get a reference to the node's is file.
|
||||
pub fn is_file(&self) -> bool {
|
||||
self.is_file
|
||||
}
|
||||
|
||||
/// Get a reference to the node's is symlink.
|
||||
pub fn is_symlink(&self) -> bool {
|
||||
self.is_symlink
|
||||
}
|
||||
|
||||
/// Get a reference to the node's is broken.
|
||||
pub fn is_broken(&self) -> bool {
|
||||
self.is_broken
|
||||
}
|
||||
|
||||
/// Get a reference to the node's is readonly.
|
||||
pub fn is_readonly(&self) -> bool {
|
||||
self.is_readonly
|
||||
}
|
||||
|
||||
/// Get a reference to the node's mime essence.
|
||||
pub fn mime_essence(&self) -> &String {
|
||||
&self.mime_essence
|
||||
}
|
||||
|
||||
/// Get a reference to the node's size.
|
||||
pub fn size(&self) -> u64 {
|
||||
self.size
|
||||
}
|
||||
|
||||
/// Get a reference to the node's canonical.
|
||||
pub fn canonical(&self) -> &Option<ResolvedNode> {
|
||||
&self.canonical
|
||||
}
|
||||
|
||||
/// Get a reference to the node's symlink.
|
||||
pub fn symlink(&self) -> &Option<ResolvedNode> {
|
||||
&self.symlink
|
||||
}
|
||||
|
||||
/// Get a reference to the node's absolute path.
|
||||
pub fn absolute_path(&self) -> &String {
|
||||
&self.absolute_path
|
||||
}
|
||||
}
|
||||
|
||||
impl Ord for Node {
|
||||
@ -217,10 +362,10 @@ impl PartialOrd for Node {
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
pub struct DirectoryBuffer {
|
||||
pub parent: String,
|
||||
pub nodes: Vec<Node>,
|
||||
pub total: usize,
|
||||
pub focus: usize,
|
||||
parent: String,
|
||||
nodes: Vec<Node>,
|
||||
total: usize,
|
||||
focus: usize,
|
||||
}
|
||||
|
||||
impl DirectoryBuffer {
|
||||
@ -237,6 +382,26 @@ impl DirectoryBuffer {
|
||||
pub fn focused_node(&self) -> Option<&Node> {
|
||||
self.nodes.get(self.focus)
|
||||
}
|
||||
|
||||
/// Get a reference to the directory buffer's parent.
|
||||
pub fn parent(&self) -> &String {
|
||||
&self.parent
|
||||
}
|
||||
|
||||
/// Get a reference to the directory buffer's nodes.
|
||||
pub fn nodes(&self) -> &Vec<Node> {
|
||||
&self.nodes
|
||||
}
|
||||
|
||||
/// Get a reference to the directory buffer's total.
|
||||
pub fn total(&self) -> usize {
|
||||
self.total
|
||||
}
|
||||
|
||||
/// Get a reference to the directory buffer's focus.
|
||||
pub fn focus(&self) -> usize {
|
||||
self.focus
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
@ -281,9 +446,9 @@ pub enum NodeSorter {
|
||||
#[derive(Debug, Clone, Eq, Serialize, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct NodeSorterApplicable {
|
||||
pub sorter: NodeSorter,
|
||||
sorter: NodeSorter,
|
||||
#[serde(default)]
|
||||
pub reverse: bool,
|
||||
reverse: bool,
|
||||
}
|
||||
|
||||
impl PartialEq for NodeSorterApplicable {
|
||||
@ -568,6 +733,16 @@ impl NodeSorterApplicable {
|
||||
.cmp(&a.symlink.as_ref().map(|s| &s.size)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a reference to the node sorter applicable's sorter.
|
||||
pub fn sorter(&self) -> &NodeSorter {
|
||||
&self.sorter
|
||||
}
|
||||
|
||||
/// Get a reference to the node sorter applicable's reverse.
|
||||
pub fn reverse(&self) -> bool {
|
||||
self.reverse
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
|
||||
@ -716,8 +891,8 @@ impl NodeFilter {
|
||||
#[derive(Debug, Clone, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct NodeFilterApplicable {
|
||||
pub filter: NodeFilter,
|
||||
pub input: String,
|
||||
filter: NodeFilter,
|
||||
input: String,
|
||||
}
|
||||
|
||||
impl NodeFilterApplicable {
|
||||
@ -728,6 +903,16 @@ impl NodeFilterApplicable {
|
||||
fn apply(&self, node: &Node) -> bool {
|
||||
self.filter.apply(node, &self.input)
|
||||
}
|
||||
|
||||
/// Get a reference to the node filter applicable's filter.
|
||||
pub fn filter(&self) -> &NodeFilter {
|
||||
&self.filter
|
||||
}
|
||||
|
||||
/// Get a reference to the node filter applicable's input.
|
||||
pub fn input(&self) -> &String {
|
||||
&self.input
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
@ -1057,10 +1242,22 @@ pub enum MsgIn {
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct Command {
|
||||
pub command: String,
|
||||
command: String,
|
||||
|
||||
#[serde(default)]
|
||||
pub args: Vec<String>,
|
||||
args: Vec<String>,
|
||||
}
|
||||
|
||||
impl Command {
|
||||
/// Get a reference to the command's command.
|
||||
pub fn command(&self) -> &String {
|
||||
&self.command
|
||||
}
|
||||
|
||||
/// Get a reference to the command's args.
|
||||
pub fn args(&self) -> &Vec<String> {
|
||||
&self.args
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
@ -1099,9 +1296,9 @@ pub enum LogLevel {
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Log {
|
||||
pub level: LogLevel,
|
||||
pub message: String,
|
||||
pub created_at: DateTime<Local>,
|
||||
level: LogLevel,
|
||||
message: String,
|
||||
created_at: DateTime<Local>,
|
||||
}
|
||||
|
||||
impl Log {
|
||||
@ -1112,6 +1309,21 @@ impl Log {
|
||||
created_at: Local::now(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a reference to the log's created at.
|
||||
pub fn created_at(&self) -> &DateTime<Local> {
|
||||
&self.created_at
|
||||
}
|
||||
|
||||
/// Get a reference to the log's message.
|
||||
pub fn message(&self) -> &String {
|
||||
&self.message
|
||||
}
|
||||
|
||||
/// Get a reference to the log's level.
|
||||
pub fn level(&self) -> &LogLevel {
|
||||
&self.level
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for Log {
|
||||
@ -1138,24 +1350,24 @@ pub struct History {
|
||||
}
|
||||
|
||||
impl History {
|
||||
pub fn push(mut self, path: String) -> Self {
|
||||
fn push(mut self, path: String) -> Self {
|
||||
self.paths = self.paths.into_iter().take(self.loc + 1).collect();
|
||||
self.paths.push(path);
|
||||
self.loc = self.paths.len().max(1) - 1;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn visit_last(mut self) -> Self {
|
||||
fn visit_last(mut self) -> Self {
|
||||
self.loc = self.loc.max(1) - 1;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn visit_next(mut self) -> Self {
|
||||
fn visit_next(mut self) -> Self {
|
||||
self.loc = (self.loc + 1).min(self.paths.len().max(1) - 1);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn peek(&self) -> Option<&String> {
|
||||
fn peek(&self) -> Option<&String> {
|
||||
self.paths.get(self.loc)
|
||||
}
|
||||
}
|
||||
@ -1285,7 +1497,7 @@ impl App {
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn enqueue(mut self, task: Task) -> Self {
|
||||
fn enqueue(mut self, task: Task) -> Self {
|
||||
self.msg_out.push_back(MsgOut::Enque(task));
|
||||
self
|
||||
}
|
||||
@ -2151,7 +2363,7 @@ impl App {
|
||||
.join("")
|
||||
}
|
||||
|
||||
pub fn write_pipes(self, last_app: &Self) -> Result<Self> {
|
||||
fn write_pipes(self, last_app: &Self) -> Result<Self> {
|
||||
if self.focused_node() != last_app.focused_node() {
|
||||
fs::write(&self.pipe().focus_out, self.focused_node_str())?;
|
||||
};
|
||||
|
@ -38,7 +38,7 @@ pub fn explore(
|
||||
nodes
|
||||
.iter()
|
||||
.enumerate()
|
||||
.find(|(_, n)| n.relative_path == focus)
|
||||
.find(|(_, n)| n.relative_path() == &focus)
|
||||
.map(|(i, _)| i)
|
||||
.unwrap_or(0)
|
||||
} else {
|
||||
|
@ -24,52 +24,45 @@ use tui::Terminal;
|
||||
handlebars_helper!(to_humansize: |size: i64| size.file_size(options::CONVENTIONAL).unwrap_or_default());
|
||||
|
||||
fn call(app: &app::App, cmd: app::Command, silent: bool) -> io::Result<ExitStatus> {
|
||||
let input_buffer = app.input_buffer().unwrap_or_default();
|
||||
|
||||
let focus_index = app
|
||||
.directory_buffer()
|
||||
.map(|d| d.focus)
|
||||
.map(|d| d.focus())
|
||||
.unwrap_or_default()
|
||||
.to_string();
|
||||
|
||||
let pipe_msg_in = app.pipe().msg_in.clone();
|
||||
let pipe_mode_out = app.pipe().mode_out.clone();
|
||||
let pipe_focus_out = app.pipe().focus_out.clone();
|
||||
let pipe_selection_out = app.pipe().selection_out.clone();
|
||||
let pipe_result_out = app.pipe().result_out.clone();
|
||||
let pipe_directory_nodes_out = app.pipe().directory_nodes_out.clone();
|
||||
let pipe_global_help_menu_out = app.pipe().global_help_menu_out.clone();
|
||||
let pipe_logs_out = app.pipe().logs_out.clone();
|
||||
let pipe_history_out = app.pipe().history_out.clone();
|
||||
let session_path = app.session_path();
|
||||
|
||||
let (stdin, stdout, stderr) = if silent {
|
||||
(Stdio::null(), Stdio::null(), Stdio::null())
|
||||
} else {
|
||||
(get_tty()?.into(), get_tty()?.into(), get_tty()?.into())
|
||||
};
|
||||
|
||||
Command::new(cmd.command.clone())
|
||||
Command::new(cmd.command().clone())
|
||||
.env("XPLR_APP_VERSION", app.version())
|
||||
.env("XPLR_CONFIG_VERSION", &app.config().version)
|
||||
.env("XPLR_PID", &app.pid().to_string())
|
||||
.env("XPLR_INPUT_BUFFER", input_buffer)
|
||||
.env("XPLR_INPUT_BUFFER", app.input_buffer().unwrap_or_default())
|
||||
.env("XPLR_FOCUS_PATH", app.focused_node_str())
|
||||
.env("XPLR_FOCUS_INDEX", focus_index)
|
||||
.env("XPLR_SESSION_PATH", session_path)
|
||||
.env("XPLR_PIPE_MSG_IN", pipe_msg_in)
|
||||
.env("XPLR_PIPE_SELECTION_OUT", pipe_selection_out)
|
||||
.env("XPLR_PIPE_HISTORY_OUT", pipe_history_out)
|
||||
.env("XPLR_PIPE_FOCUS_OUT", pipe_focus_out)
|
||||
.env("XPLR_PIPE_MODE_OUT", pipe_mode_out)
|
||||
.env("XPLR_PIPE_RESULT_OUT", pipe_result_out)
|
||||
.env("XPLR_PIPE_GLOBAL_HELP_MENU_OUT", pipe_global_help_menu_out)
|
||||
.env("XPLR_PIPE_DIRECTORY_NODES_OUT", pipe_directory_nodes_out)
|
||||
.env("XPLR_PIPE_LOGS_OUT", pipe_logs_out)
|
||||
.env("XPLR_SESSION_PATH", app.session_path())
|
||||
.env("XPLR_PIPE_MSG_IN", app.pipe().msg_in())
|
||||
.env("XPLR_PIPE_SELECTION_OUT", app.pipe().selection_out())
|
||||
.env("XPLR_PIPE_HISTORY_OUT", app.pipe().history_out())
|
||||
.env("XPLR_PIPE_FOCUS_OUT", app.pipe().focus_out())
|
||||
.env("XPLR_PIPE_MODE_OUT", app.pipe().mode_out())
|
||||
.env("XPLR_PIPE_RESULT_OUT", app.pipe().result_out())
|
||||
.env(
|
||||
"XPLR_PIPE_GLOBAL_HELP_MENU_OUT",
|
||||
app.pipe().global_help_menu_out(),
|
||||
)
|
||||
.env(
|
||||
"XPLR_PIPE_DIRECTORY_NODES_OUT",
|
||||
app.pipe().directory_nodes_out(),
|
||||
)
|
||||
.env("XPLR_PIPE_LOGS_OUT", app.pipe().logs_out())
|
||||
.stdin(stdin)
|
||||
.stdout(stdout)
|
||||
.stderr(stderr)
|
||||
.args(cmd.args)
|
||||
.args(cmd.args())
|
||||
.status()
|
||||
}
|
||||
|
||||
@ -115,7 +108,7 @@ pub fn run(mut app: app::App, focused_path: Option<String>) -> Result<Option<Str
|
||||
|
||||
// Threads
|
||||
auto_refresher::start_auto_refreshing(tx_msg_in.clone());
|
||||
pipe_reader::keep_reading(app.pipe().msg_in.clone(), tx_msg_in.clone());
|
||||
pipe_reader::keep_reading(app.pipe().msg_in().clone(), tx_msg_in.clone());
|
||||
event_reader::keep_reading(tx_msg_in.clone(), rx_event_reader);
|
||||
pwd_watcher::keep_watching(app.pwd(), tx_msg_in.clone(), rx_pwd_watcher)?;
|
||||
|
||||
@ -168,7 +161,7 @@ pub fn run(mut app: app::App, focused_path: Option<String>) -> Result<Option<Str
|
||||
explorer::explore(
|
||||
app.explorer_config().clone(),
|
||||
app.pwd().clone(),
|
||||
app.focused_node().map(|n| n.relative_path.clone()),
|
||||
app.focused_node().map(|n| n.relative_path().clone()),
|
||||
tx_msg_in.clone(),
|
||||
);
|
||||
}
|
||||
@ -179,7 +172,7 @@ pub fn run(mut app: app::App, focused_path: Option<String>) -> Result<Option<Str
|
||||
explorer::explore(
|
||||
app.explorer_config().clone(),
|
||||
app.pwd().clone(),
|
||||
app.focused_node().map(|n| n.relative_path.clone()),
|
||||
app.focused_node().map(|n| n.relative_path().clone()),
|
||||
tx_msg_in.clone(),
|
||||
);
|
||||
};
|
||||
|
158
src/ui.rs
158
src/ui.rs
@ -23,10 +23,10 @@ lazy_static! {
|
||||
#[derive(Debug, Copy, Clone, Default, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct Style {
|
||||
pub fg: Option<Color>,
|
||||
pub bg: Option<Color>,
|
||||
pub add_modifier: Option<Modifier>,
|
||||
pub sub_modifier: Option<Modifier>,
|
||||
fg: Option<Color>,
|
||||
bg: Option<Color>,
|
||||
add_modifier: Option<Modifier>,
|
||||
sub_modifier: Option<Modifier>,
|
||||
}
|
||||
|
||||
impl Style {
|
||||
@ -68,25 +68,25 @@ impl Into<TuiStyle> for Style {
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct ResolvedNodeUiMetadata {
|
||||
pub absolute_path: String,
|
||||
pub extension: String,
|
||||
pub is_dir: bool,
|
||||
pub is_file: bool,
|
||||
pub is_readonly: bool,
|
||||
pub mime_essence: String,
|
||||
pub size: u64,
|
||||
absolute_path: String,
|
||||
extension: String,
|
||||
is_dir: bool,
|
||||
is_file: bool,
|
||||
is_readonly: bool,
|
||||
mime_essence: String,
|
||||
size: u64,
|
||||
}
|
||||
|
||||
impl From<ResolvedNode> for ResolvedNodeUiMetadata {
|
||||
fn from(node: ResolvedNode) -> Self {
|
||||
Self {
|
||||
absolute_path: node.absolute_path.clone(),
|
||||
extension: node.extension.clone(),
|
||||
is_dir: node.is_dir,
|
||||
is_file: node.is_file,
|
||||
is_readonly: node.is_readonly,
|
||||
mime_essence: node.mime_essence,
|
||||
size: node.size,
|
||||
absolute_path: node.absolute_path().clone(),
|
||||
extension: node.extension().clone(),
|
||||
is_dir: node.is_dir(),
|
||||
is_file: node.is_file(),
|
||||
is_readonly: node.is_readonly(),
|
||||
mime_essence: node.mime_essence().clone(),
|
||||
size: node.size(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -95,32 +95,32 @@ impl From<ResolvedNode> for ResolvedNodeUiMetadata {
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct NodeUiMetadata {
|
||||
// From Node
|
||||
pub parent: String,
|
||||
pub relative_path: String,
|
||||
pub absolute_path: String,
|
||||
pub extension: String,
|
||||
pub is_symlink: bool,
|
||||
pub is_broken: bool,
|
||||
pub is_dir: bool,
|
||||
pub is_file: bool,
|
||||
pub is_readonly: bool,
|
||||
pub mime_essence: String,
|
||||
pub size: u64,
|
||||
pub canonical: Option<ResolvedNodeUiMetadata>,
|
||||
pub symlink: Option<ResolvedNodeUiMetadata>,
|
||||
parent: String,
|
||||
relative_path: String,
|
||||
absolute_path: String,
|
||||
extension: String,
|
||||
is_symlink: bool,
|
||||
is_broken: bool,
|
||||
is_dir: bool,
|
||||
is_file: bool,
|
||||
is_readonly: bool,
|
||||
mime_essence: String,
|
||||
size: u64,
|
||||
canonical: Option<ResolvedNodeUiMetadata>,
|
||||
symlink: Option<ResolvedNodeUiMetadata>,
|
||||
|
||||
// Extra
|
||||
pub index: usize,
|
||||
pub relative_index: usize,
|
||||
pub is_before_focus: bool,
|
||||
pub is_after_focus: bool,
|
||||
pub tree: String,
|
||||
pub prefix: String,
|
||||
pub suffix: String,
|
||||
pub is_selected: bool,
|
||||
pub is_focused: bool,
|
||||
pub total: usize,
|
||||
pub meta: HashMap<String, String>,
|
||||
index: usize,
|
||||
relative_index: usize,
|
||||
is_before_focus: bool,
|
||||
is_after_focus: bool,
|
||||
tree: String,
|
||||
prefix: String,
|
||||
suffix: String,
|
||||
is_selected: bool,
|
||||
is_focused: bool,
|
||||
total: usize,
|
||||
meta: HashMap<String, String>,
|
||||
}
|
||||
|
||||
impl NodeUiMetadata {
|
||||
@ -139,19 +139,19 @@ impl NodeUiMetadata {
|
||||
meta: HashMap<String, String>,
|
||||
) -> Self {
|
||||
Self {
|
||||
parent: node.parent.clone(),
|
||||
relative_path: node.relative_path.clone(),
|
||||
absolute_path: node.absolute_path.clone(),
|
||||
extension: node.extension.clone(),
|
||||
is_symlink: node.is_symlink,
|
||||
is_broken: node.is_broken,
|
||||
is_dir: node.is_dir,
|
||||
is_file: node.is_file,
|
||||
is_readonly: node.is_readonly,
|
||||
mime_essence: node.mime_essence.clone(),
|
||||
size: node.size,
|
||||
canonical: node.canonical.to_owned().map(|s| s.into()),
|
||||
symlink: node.symlink.to_owned().map(|s| s.into()),
|
||||
parent: node.parent().clone(),
|
||||
relative_path: node.relative_path().clone(),
|
||||
absolute_path: node.absolute_path().clone(),
|
||||
extension: node.extension().clone(),
|
||||
is_symlink: node.is_symlink(),
|
||||
is_broken: node.is_broken(),
|
||||
is_dir: node.is_dir(),
|
||||
is_file: node.is_file(),
|
||||
is_readonly: node.is_readonly(),
|
||||
mime_essence: node.mime_essence().clone(),
|
||||
size: node.size(),
|
||||
canonical: node.canonical().to_owned().map(|s| s.into()),
|
||||
symlink: node.symlink().to_owned().map(|s| s.into()),
|
||||
index,
|
||||
relative_index,
|
||||
is_before_focus,
|
||||
@ -175,19 +175,19 @@ fn draw_table<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, hb: &Han
|
||||
let rows = app
|
||||
.directory_buffer()
|
||||
.map(|dir| {
|
||||
dir.nodes
|
||||
dir.nodes()
|
||||
.iter()
|
||||
.enumerate()
|
||||
.skip(height * (dir.focus / height.max(1)))
|
||||
.skip(height * (dir.focus() / height.max(1)))
|
||||
.take(height)
|
||||
.map(|(index, node)| {
|
||||
let is_focused = dir.focus == index;
|
||||
let is_focused = dir.focus() == index;
|
||||
|
||||
// TODO : Optimize
|
||||
let is_selected = app.selection().contains(node);
|
||||
|
||||
let is_first = index == 0;
|
||||
let is_last = index == dir.total.max(1) - 1;
|
||||
let is_last = index == dir.total().max(1) - 1;
|
||||
|
||||
let tree = config
|
||||
.general
|
||||
@ -208,13 +208,13 @@ fn draw_table<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, hb: &Han
|
||||
let node_type = config
|
||||
.node_types
|
||||
.special
|
||||
.get(&node.relative_path)
|
||||
.or_else(|| config.node_types.extension.get(&node.extension))
|
||||
.or_else(|| config.node_types.mime_essence.get(&node.mime_essence))
|
||||
.get(node.relative_path())
|
||||
.or_else(|| config.node_types.extension.get(node.extension()))
|
||||
.or_else(|| config.node_types.mime_essence.get(node.mime_essence()))
|
||||
.unwrap_or_else(|| {
|
||||
if node.is_symlink {
|
||||
if node.is_symlink() {
|
||||
&config.node_types.symlink
|
||||
} else if node.is_dir {
|
||||
} else if node.is_dir() {
|
||||
&config.node_types.directory
|
||||
} else {
|
||||
&config.node_types.file
|
||||
@ -222,9 +222,9 @@ fn draw_table<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, hb: &Han
|
||||
});
|
||||
|
||||
let (relative_index, is_before_focus, is_after_focus) =
|
||||
match dir.focus.cmp(&index) {
|
||||
Ordering::Greater => (dir.focus - index, true, false),
|
||||
Ordering::Less => (index - dir.focus, false, true),
|
||||
match dir.focus().cmp(&index) {
|
||||
Ordering::Greater => (dir.focus() - index, true, false),
|
||||
Ordering::Less => (index - dir.focus(), false, true),
|
||||
Ordering::Equal => (0, false, false),
|
||||
};
|
||||
|
||||
@ -258,7 +258,7 @@ fn draw_table<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, hb: &Han
|
||||
suffix.unwrap_or_default(),
|
||||
is_selected,
|
||||
is_focused,
|
||||
dir.total,
|
||||
dir.total(),
|
||||
node_type.meta.clone(),
|
||||
);
|
||||
|
||||
@ -294,7 +294,7 @@ fn draw_table<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, hb: &Han
|
||||
.block(Block::default().borders(Borders::ALL).title(format!(
|
||||
" {} ({}) ",
|
||||
app.pwd(),
|
||||
app.directory_buffer().map(|d| d.total).unwrap_or_default()
|
||||
app.directory_buffer().map(|d| d.total()).unwrap_or_default()
|
||||
)));
|
||||
|
||||
let table = table.clone().header(
|
||||
@ -323,7 +323,7 @@ fn draw_selection<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, _: &
|
||||
.rev()
|
||||
.take((rect.height.max(2) - 2).into())
|
||||
.rev()
|
||||
.map(|n| n.absolute_path.clone())
|
||||
.map(|n| n.absolute_path().clone())
|
||||
.map(ListItem::new)
|
||||
.collect();
|
||||
|
||||
@ -433,24 +433,24 @@ fn draw_sort_n_filter_by<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::Ap
|
||||
.iter()
|
||||
.map(|f| {
|
||||
ui.filter_identifiers
|
||||
.get(&f.filter)
|
||||
.get(&f.filter())
|
||||
.map(|u| {
|
||||
(
|
||||
Span::styled(u.format.to_owned().unwrap_or_default(), u.style.into()),
|
||||
Span::raw(f.input.clone()),
|
||||
Span::raw(f.input().clone()),
|
||||
)
|
||||
})
|
||||
.unwrap_or_else(|| (Span::raw("f"), Span::raw("")))
|
||||
})
|
||||
.chain(sort_by.iter().map(|s| {
|
||||
let direction = if s.reverse {
|
||||
let direction = if s.reverse() {
|
||||
reverse.clone()
|
||||
} else {
|
||||
forward.clone()
|
||||
};
|
||||
|
||||
ui.sorter_identifiers
|
||||
.get(&s.sorter)
|
||||
.get(&s.sorter())
|
||||
.map(|u| {
|
||||
(
|
||||
Span::styled(u.format.to_owned().unwrap_or_default(), u.style.into()),
|
||||
@ -484,27 +484,27 @@ fn draw_logs<B: Backend>(f: &mut Frame<B>, rect: Rect, app: &app::App, _: &Handl
|
||||
.take(1)
|
||||
.rev()
|
||||
.map(|l| {
|
||||
let time = l.created_at.format("%r");
|
||||
match &l.level {
|
||||
let time = l.created_at().format("%r");
|
||||
match l.level() {
|
||||
app::LogLevel::Info => ListItem::new(format!(
|
||||
"{} | {} | {}",
|
||||
&time,
|
||||
&config.info.format.to_owned().unwrap_or_default(),
|
||||
&l.message
|
||||
l.message()
|
||||
))
|
||||
.style(config.info.style.into()),
|
||||
app::LogLevel::Success => ListItem::new(format!(
|
||||
"{} | {} | {}",
|
||||
&time,
|
||||
&config.success.format.to_owned().unwrap_or_default(),
|
||||
&l.message
|
||||
l.message()
|
||||
))
|
||||
.style(config.success.style.into()),
|
||||
app::LogLevel::Error => ListItem::new(format!(
|
||||
"{} | {} | {}",
|
||||
&time,
|
||||
&config.error.format.to_owned().unwrap_or_default(),
|
||||
&l.message
|
||||
l.message()
|
||||
))
|
||||
.style(config.error.style.into()),
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user