Add sort
This commit is contained in:
parent
0a9ccdbf27
commit
9761e5c0c5
@ -7,7 +7,7 @@ impl From<std::io::Error> for KakMessage {
|
|||||||
fn from(err: std::io::Error) -> Self {
|
fn from(err: std::io::Error) -> Self {
|
||||||
Self(
|
Self(
|
||||||
"Error writing to fifo".to_string(),
|
"Error writing to fifo".to_string(),
|
||||||
Some(format!("{:?}", err)),
|
Some(format!("{}", err)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
src/main.rs
14
src/main.rs
@ -1,9 +1,10 @@
|
|||||||
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
|
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
|
||||||
#![allow(dead_code, unused_imports)]
|
// #![allow(dead_code, unused_imports)]
|
||||||
|
|
||||||
mod errors;
|
mod errors;
|
||||||
mod shuf;
|
mod shuf;
|
||||||
mod sort;
|
mod sort;
|
||||||
|
mod uniq;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use errors::KakMessage;
|
use errors::KakMessage;
|
||||||
use shuf::ShufOptions;
|
use shuf::ShufOptions;
|
||||||
@ -14,6 +15,7 @@ use std::{
|
|||||||
io::Write,
|
io::Write,
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
};
|
};
|
||||||
|
use uniq::UniqOptions;
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[clap(about, version, author)]
|
#[clap(about, version, author)]
|
||||||
@ -31,6 +33,7 @@ struct Cli {
|
|||||||
enum Commands {
|
enum Commands {
|
||||||
Sort(SortOptions),
|
Sort(SortOptions),
|
||||||
Shuf(ShufOptions),
|
Shuf(ShufOptions),
|
||||||
|
Uniq(UniqOptions),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, PartialOrd, Ord, Eq, Debug)]
|
#[derive(PartialEq, PartialOrd, Ord, Eq, Debug)]
|
||||||
@ -103,10 +106,6 @@ impl SelectionDesc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// impl PartialOrd for SelectionDesc {
|
|
||||||
// fn cmp() {}
|
|
||||||
// }
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let msg = match run() {
|
let msg = match run() {
|
||||||
Ok(msg) => msg,
|
Ok(msg) => msg,
|
||||||
@ -122,7 +121,7 @@ fn main() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let Err(e) = send_message(&msg) {
|
if let Err(e) = send_message(&msg) {
|
||||||
println!("{:?}", e);
|
println!("{}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,13 +145,14 @@ fn run() -> Result<KakMessage, KakMessage> {
|
|||||||
let options = Cli::try_parse().map_err(|e| {
|
let options = Cli::try_parse().map_err(|e| {
|
||||||
KakMessage(
|
KakMessage(
|
||||||
"Error parsing arguments".to_string(),
|
"Error parsing arguments".to_string(),
|
||||||
Some(format!("Could not parse: {:?}", e)),
|
Some(format!("Could not parse: {}", e)),
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
match &options.command {
|
match &options.command {
|
||||||
Commands::Sort(sort_options) => sort::sort(sort_options),
|
Commands::Sort(sort_options) => sort::sort(sort_options),
|
||||||
Commands::Shuf(shuf_options) => shuf::shuf(shuf_options),
|
Commands::Shuf(shuf_options) => shuf::shuf(shuf_options),
|
||||||
|
Commands::Uniq(uniq_options) => uniq::uniq(uniq_options),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
19
src/sort.rs
19
src/sort.rs
@ -1,6 +1,5 @@
|
|||||||
use crate::{kak_response, open_command_fifo, KakMessage, SelectionDesc};
|
use crate::{kak_response, open_command_fifo, KakMessage, SelectionDesc};
|
||||||
use alphanumeric_sort::compare_str;
|
use alphanumeric_sort::compare_str;
|
||||||
use rand::{seq::SliceRandom, thread_rng};
|
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::{cmp::Ordering, io::Write, str::FromStr};
|
use std::{cmp::Ordering, io::Write, str::FromStr};
|
||||||
|
|
||||||
@ -11,7 +10,7 @@ pub struct SortOptions {
|
|||||||
#[clap(short = 's', long)]
|
#[clap(short = 's', long)]
|
||||||
subselections_register: Option<char>,
|
subselections_register: Option<char>,
|
||||||
// TODO: Can we invert a boolean? This name is terrible
|
// TODO: Can we invert a boolean? This name is terrible
|
||||||
#[clap(short = 'S', long)]
|
#[clap(short = 'S', long, parse(try_from_str = invert_bool), default_value_t)]
|
||||||
no_skip_whitespace: bool,
|
no_skip_whitespace: bool,
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
lexicographic_sort: bool,
|
lexicographic_sort: bool,
|
||||||
@ -21,6 +20,15 @@ pub struct SortOptions {
|
|||||||
ignore_case: bool,
|
ignore_case: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn invert_bool(s: &str) -> Result<bool, &'static str> {
|
||||||
|
// Invert the boolean
|
||||||
|
match s {
|
||||||
|
"false" => Ok(true),
|
||||||
|
"true" => Ok(false),
|
||||||
|
_ => Err("Unparsable boolean value"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct SortableSelection<'a> {
|
struct SortableSelection<'a> {
|
||||||
/// The content of the selection
|
/// The content of the selection
|
||||||
content: &'a str,
|
content: &'a str,
|
||||||
@ -58,9 +66,12 @@ fn get_sortable_selections_subselections<'a, 'b, 'tmp, S: AsRef<str> + std::fmt:
|
|||||||
let mut subselections = subselections
|
let mut subselections = subselections
|
||||||
.iter()
|
.iter()
|
||||||
.zip(subselections_desc.iter())
|
.zip(subselections_desc.iter())
|
||||||
.map(|(s, sd)| Ok((s.as_ref(), SelectionDesc::from_str(sd.as_ref())?)))
|
// Bind selection with associated description
|
||||||
|
// Sort descriptions so left is always <= right
|
||||||
|
.map(|(s, sd)| Ok((s.as_ref(), SelectionDesc::from_str(sd.as_ref())?.sort())))
|
||||||
.collect::<Result<Vec<(&str, SelectionDesc)>, KakMessage>>()?;
|
.collect::<Result<Vec<(&str, SelectionDesc)>, KakMessage>>()?;
|
||||||
|
|
||||||
|
// Sort subselections by description
|
||||||
subselections.sort_by(|(_, ssd_a), (_, ssd_b)| ssd_a.cmp(ssd_b));
|
subselections.sort_by(|(_, ssd_a), (_, ssd_b)| ssd_a.cmp(ssd_b));
|
||||||
|
|
||||||
// For each selection, check if they contain any subselections
|
// For each selection, check if they contain any subselections
|
||||||
@ -113,6 +124,8 @@ fn to_sortable_selection<'a, 'b>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn sort(sort_options: &SortOptions) -> Result<KakMessage, KakMessage> {
|
pub fn sort(sort_options: &SortOptions) -> Result<KakMessage, KakMessage> {
|
||||||
|
eprintln!("Got sort options: {:?}", sort_options);
|
||||||
|
|
||||||
let subselections: Option<(Vec<String>, Vec<String>)> = sort_options
|
let subselections: Option<(Vec<String>, Vec<String>)> = sort_options
|
||||||
.subselections_register
|
.subselections_register
|
||||||
.map::<Result<(Vec<String>, Vec<String>), KakMessage>, _>(|_c| {
|
.map::<Result<(Vec<String>, Vec<String>), KakMessage>, _>(|_c| {
|
||||||
|
Loading…
Reference in New Issue
Block a user