added fuzzy cutoff functionality

This commit is contained in:
Djairo Hougee 2023-05-09 19:47:55 +02:00
parent d6438e30f2
commit fd3c041e28
2 changed files with 16 additions and 13 deletions

View File

@ -4,19 +4,20 @@ use string_builder::Builder;
use crate::structs::{config::{Field, Config}, data::Data}; use crate::structs::{config::{Field, Config}, data::Data};
// TODO: update this function to apply a 'fuzzy' mode instead (possibly add config option).
// This would find the space character nearest the num_chars index and cut off there, allowing for cleaner truncation. fn fuzzy_cutoff(str: &str) -> usize{
fn cutoff(fields: &Vec<Field>, brk: Option<char>, strings: &mut HashMap<String, String>) { str.rfind(char::is_whitespace).unwrap_or(usize::MAX)
}
fn cutoff(fields: &Vec<Field>, brk: Option<char>, fuzzy: bool, strings: &mut HashMap<String, String>) {
for field in fields { for field in fields {
if !field.field.eq("xesam:userRating") && !field.field.eq("xesam:autoRating") { if let Some(str) = strings.get_mut(&field.field) {
let a = strings.get(&field.field); if !field.field.eq("xesam:userRating") && str.len() >= field.num_chars as usize {
if a.is_some() && a.unwrap().len() >= field.num_chars as usize { str.truncate(field.num_chars as usize);
let mut b = a.unwrap().clone(); if fuzzy {str.truncate(fuzzy_cutoff(str))}
b.truncate(field.num_chars as usize);
if let Some(c) = brk { if let Some(c) = brk {
b.push(c) str.push(c);
} }
strings.insert(field.field.clone(), b);
} }
} }
} }
@ -42,7 +43,7 @@ fn append_fields(b: &mut Builder, cfg: &Config, data: &Data) {
fn build_string(cfg: &Config, data: &mut Data) -> String { fn build_string(cfg: &Config, data: &mut Data) -> String {
let mut b = Builder::default(); let mut b = Builder::default();
if cfg.render_prefix { if cfg.render_prefix {
append_prefix(&mut b, data); append_prefix(&mut b, data);
} }
@ -54,10 +55,10 @@ fn build_string(cfg: &Config, data: &mut Data) -> String {
} }
pub fn print_text(cfg: &Config, data: &mut Data) { pub fn print_text(cfg: &Config, data: &mut Data) {
if cfg.hide_output && data.current_player.is_none() { if (cfg.hide_output && data.current_player.is_none()) || data.display_text.is_empty() || cfg.metadata_fields.is_empty() {
println!(""); println!("");
} else { } else {
cutoff(&cfg.metadata_fields, cfg.break_character, &mut data.display_text); cutoff(&cfg.metadata_fields, cfg.break_character, cfg.fuzzy, &mut data.display_text);
println!("{}", build_string(cfg, data)); println!("{}", build_string(cfg, data));
} }
} }

View File

@ -52,6 +52,7 @@ pub struct Config {
pub metadata_separator: char, pub metadata_separator: char,
pub array_separator: char, pub array_separator: char,
pub hide_output: bool, pub hide_output: bool,
pub fuzzy: bool,
pub render_prefix: bool, pub render_prefix: bool,
pub break_character: Option<char>, pub break_character: Option<char>,
pub player_priorities: Vec<String>, pub player_priorities: Vec<String>,
@ -69,6 +70,7 @@ impl Default for Config {
metadata_separator: '|', metadata_separator: '|',
array_separator: '+', array_separator: '+',
hide_output: true, hide_output: true,
fuzzy: false,
render_prefix: true, render_prefix: true,
metadata_fields: vec![Field::constructor("xesam:title", 40), Field::constructor("xesam:artist", 20)], metadata_fields: vec![Field::constructor("xesam:title", 40), Field::constructor("xesam:artist", 20)],
rating_icons: Rating::default(), rating_icons: Rating::default(),