Skip to content

Commit

Permalink
Add a global list command
Browse files Browse the repository at this point in the history
  • Loading branch information
Dlurak committed Aug 21, 2024
1 parent 5eef063 commit 0e1363d
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 37 deletions.
13 changes: 13 additions & 0 deletions src/cli/list.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use clap::Parser;

#[derive(Parser, Debug)]
pub struct ListCli {
#[arg(long = "format-project", short = 'p', alias = "fmt-proj")]
pub format_project: Option<String>,

#[arg(long = "format-template", short = 't', alias = "fmt-temp")]
pub format_template: Option<String>,

#[arg(long = "format-directory", short = 'd', alias = "fmt-dir")]
pub format_directory: Option<String>,
}
10 changes: 6 additions & 4 deletions src/cli/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
pub mod directory;
pub mod list;
pub mod project;
pub mod template;

use self::{directory::DirectoryCli, project::ProjectCli, template::TemplateCli};
use clap::{Parser, Subcommand};

/// A CLI for tmux session management
Expand All @@ -23,13 +23,15 @@ pub enum Commands {
///
/// This command provides functionalities to interact with tmux sessions based on directories.
#[command(alias = "dir", alias = "dirs", alias = "directories")]
Directory(DirectoryCli),
Directory(directory::DirectoryCli),
/// Manage templates in the context of muxmate and tmux
///
/// This command provides functionalities to interact with tmux sessions based on templates
#[command(alias = "temp", alias = "templ")]
Template(TemplateCli),
Template(template::TemplateCli),

#[command(alias = "proj", alias = "projects")]
Project(ProjectCli),
Project(project::ProjectCli),

List(list::ListCli),
}
36 changes: 16 additions & 20 deletions src/commands/directory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ use crate::{
directories::{self, Directory},
helpers::{absolute_path, dir_name, Exit},
tmux::{attach, session_exists},
widgets::{heading::Heading, table::Table},
widgets::table::Table,
};
use std::{collections::HashMap, path::PathBuf};
use std::path::PathBuf;
use tmux_interface::{NewSession, Tmux};

pub fn directory_handler(args: DirectoryCli) {
Expand All @@ -17,31 +17,28 @@ pub fn directory_handler(args: DirectoryCli) {
}

fn list_handler(args: ListDirectoryArgs) {
let config = directories::parse_directory_config();
let categories = config.categories;
let dirs = directories::parse_directory_config();

if args.minimal {
println!("{}", format_categories_minimal(&categories));
println!("{}", format_dirs_minimal(dirs));
return;
}

for (key, value) in categories {
println!("{}", Heading(key));
println!("{}", Table::from_iter(value.iter()));
}
let tables = dirs.into_iter().map(Table::from);
let table: Table<_, _> = tables.collect();
println!("{}", table);
}

fn format_categories_minimal(categories: &HashMap<String, Vec<Directory>>) -> String {
let categories_formatted: Vec<_> = categories
.iter()
.map(move |(key, dirs)| {
let dirs_formatted: Vec<_> = dirs.iter().map(|x| x.to_string()).collect();
let dirs = dirs_formatted.join("\n");
format!("{}\n{}", key, dirs)
fn format_dirs_minimal(dirs: Vec<Directory>) -> String {
let dirs_formatted: Vec<_> = dirs
.into_iter()
.map(|dir| {
let name = dir.name.unwrap_or("No name".to_string());
format!("\"{}\" {}", name, dir.path.display())
})
.collect();

categories_formatted.join("\n\n")
dirs_formatted.join("\n")
}

fn start_handler(args: StartDirectoryArgs) {
Expand All @@ -66,9 +63,8 @@ fn start_handler(args: StartDirectoryArgs) {
}

fn resolve_dir_path(cli_args: &StartDirectoryArgs) -> (String, PathBuf) {
let config = directories::parse_directory_config();
let dirs: Vec<_> = config.categories.values().flatten().collect();
let dir = dirs.iter().find(|&&d| d.get_name() == cli_args.directory);
let dirs = directories::parse_directory_config();
let dir = dirs.iter().find(|d| d.get_name() == cli_args.directory);
let user_name = cli_args.name.clone();

match dir {
Expand Down
20 changes: 20 additions & 0 deletions src/commands/list.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use crate::{cli::list::ListCli, directories, helpers::format_name, projects, templates};

pub fn list_handler(args: ListCli) {
let projects = projects::parse_project_config();
let templates = templates::parse_template_config();
let dirs = directories::parse_directory_config();

for i in projects {
println!("{}", format_name(&args.format_project, &i.name));
}
for i in templates.into_iter().filter(|x| !x.hidden.unwrap_or(false)) {
println!("{}", format_name(&args.format_template, &i.name));
}

for i in dirs {
if let Some(name) = &i.name {
println!("{}", format_name(&args.format_directory, name));
}
}
}
1 change: 1 addition & 0 deletions src/commands/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
pub mod directory;
pub mod init;
pub mod list;
pub mod project;
pub mod template;
19 changes: 6 additions & 13 deletions src/directories.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{
widgets::table::Table,
};
use serde::Deserialize;
use std::{collections::HashMap, fmt, fs};
use std::{fmt, fs};

#[derive(Debug, Deserialize)]
pub struct Directory {
Expand Down Expand Up @@ -34,8 +34,8 @@ impl fmt::Display for Directory {
}
}

impl From<&Directory> for Table<String, String> {
fn from(value: &Directory) -> Self {
impl From<Directory> for Table<String, String> {
fn from(value: Directory) -> Self {
let first_col = match (&value.icon, &value.name) {
(Some(icon), Some(name)) => format!("{} {}", icon, name),
(Some(icon), None) => icon.clone(),
Expand All @@ -47,17 +47,10 @@ impl From<&Directory> for Table<String, String> {
}
}

#[derive(Debug, Deserialize)]
pub struct Categories {
#[serde(flatten)]
pub categories: HashMap<String, Vec<Directory>>,
}

pub fn parse_directory_config() -> Categories {
pub fn parse_directory_config() -> Vec<Directory> {
let yaml_content = fs::read_to_string(get_config_dir().join("directories.yaml"))
.exit(1, "Can't read directories config");
let categories: Categories = serde_yaml::from_str(&yaml_content)
.exit(1, "Can't parse the directories config, please correct it");

categories
serde_yaml::from_str(&yaml_content)
.exit(1, "Can't parse the directories config, please correct it")
}
7 changes: 7 additions & 0 deletions src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ pub fn dir_name(path: &Path) -> String {
.unwrap_or("".to_string())
}

pub fn format_name(user_fmt: &Option<String>, name: &str) -> String {
match user_fmt {
Some(fmt) => fmt.replace("{}", name),
None => name.to_string(),
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ fn main() {
cli::Commands::Directory(args) => commands::directory::directory_handler(args),
cli::Commands::Template(args) => commands::template::template_handler(args),
cli::Commands::Project(args) => commands::project::project_handler(args),
cli::Commands::List(args) => commands::list::list_handler(args),
}
}

0 comments on commit 0e1363d

Please sign in to comment.