feat: added support for formatting strings

This commit is contained in:
Djairo Hougee 2023-11-05 16:24:49 +01:00
parent 1fbdd2463c
commit 137c3b1456
7 changed files with 25 additions and 13 deletions

0
.gitignore vendored Normal file → Executable file
View File

View File

@ -18,3 +18,4 @@ log = "0.4"
signal-hook = "0.3.*" signal-hook = "0.3.*"
toml = "0.5.*" toml = "0.5.*"
clap = { version = "4.2.*", features = ["derive"] } clap = { version = "4.2.*", features = ["derive"] }
dyn-fmt = "0.4.0"

View File

@ -21,7 +21,7 @@ mod structs;
mod print_players; mod print_players;
/// This function deals with an incoming (USR1) signal. /// This function deals with an incoming (USR1) signal.
/// It is hard-coded to play/payse the active player. /// It is hard-coded to play/pause the active player.
/// ///
/// input: /// input:
/// data: Data struct for active configuration. /// data: Data struct for active configuration.

View File

@ -2,6 +2,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use log::{info, error}; use log::{info, error};
use string_builder::Builder; use string_builder::Builder;
use dyn_fmt::AsStrFormatExt;
use crate::structs::{config::{Field, Config}, data::Data}; use crate::structs::{config::{Field, Config}, data::Data};
@ -34,7 +35,7 @@ fn get_char_boundary(str: &str, max_len: usize) -> usize {
} }
} }
/// This function applies truncation to each strings in the given hashmap, as dictated by the values in the given Fields. /// This function applies truncation to each string in the given hashmap, as dictated by the values in the given Fields.
/// It also applies fuzzy cutoff if the configuration option for this is enabled. /// It also applies fuzzy cutoff if the configuration option for this is enabled.
/// ///
/// Input: /// Input:
@ -80,7 +81,7 @@ fn append_fields(b: &mut Builder, cfg: &Config, data: &Data) {
for field in &cfg.metadata_fields { for field in &cfg.metadata_fields {
if let Some(string) = data.field_text.get(&field.field) { if let Some(string) = data.field_text.get(&field.field) {
idx += 1; idx += 1;
b.append(string.as_str()); b.append(field.format.format(&[string.as_str()]));
if idx < len {b.append(cfg.metadata_separator.as_str())}; if idx < len {b.append(cfg.metadata_separator.as_str())};
} else { } else {
info!("failed to get {} value!", field.field); info!("failed to get {} value!", field.field);

View File

@ -1,14 +1,17 @@
//! This file contains structs and functions concerning themselves with the configuration of the program. //! This file contains structs and functions concerning themselves with the configuration of the program.
use std::{collections::HashMap}; use std::collections::HashMap;
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
/// This struct represents one metadata field to be rendered, as well as the maximum length of its' output. /// This struct represents one metadata field to be rendered, as well as the maximum length of its' output.
/// There is also support for custom formatting.
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct Field { pub struct Field {
/// The name of the metadata field. /// The name of the metadata field.
pub field: String, pub field: String,
/// The maximum length of the metadata field's output. /// The maximum length of the metadata field's output.
pub num_chars: u8 pub num_chars: u32,
/// Formatting to apply. (the value "{}" is substituted with the actual string)
pub format: String
} }
impl Field { impl Field {
@ -16,13 +19,15 @@ impl Field {
/// input: /// input:
/// field: name of the field /// field: name of the field
/// num_chars: maximum length of the field /// num_chars: maximum length of the field
/// format: what formatting to apply to the field
/// ///
/// returns: /// returns:
/// a new Field with the given parameters. /// a new Field with the given parameters.
fn new(field: String, num_chars: u8) -> Self { fn new(field: String, num_chars: u32, format: String) -> Self {
Field { Field {
field, field,
num_chars num_chars,
format
} }
} }
@ -30,11 +35,16 @@ impl Field {
/// input: /// input:
/// field: name of the field /// field: name of the field
/// num_chars: maximum length of the field /// num_chars: maximum length of the field
/// format: (optional), formatting to apply.
/// ///
/// returns: /// returns:
/// a new Field with the given parameters. /// a new Field with the given parameters.
pub fn constructor(field: &str, num_chars: u8) -> Self { pub fn constructor(field: &str, num_chars: u32, format: Option<String>) -> Self {
Self::new(field.to_owned(), num_chars) if let Some(format) = format {
Self::new(field.to_owned(), num_chars, format)
} else {
Self::new(field.to_owned(), num_chars, "{}".to_owned())
}
} }
} }
@ -189,8 +199,8 @@ impl Config {
/// It contains the "title" and "artist" fields, with 40 and 20 maximum characters respectively. /// It contains the "title" and "artist" fields, with 40 and 20 maximum characters respectively.
fn default_metadata_fields() -> Vec<Field> { fn default_metadata_fields() -> Vec<Field> {
vec![ vec![
Field::constructor("xesam:title", 40), Field::constructor("xesam:title", 40, None),
Field::constructor("xesam:artist", 20) Field::constructor("xesam:artist", 20, None)
] ]
} }

View File

@ -1,6 +1,6 @@
//! This file deals with updating the actual message, including proper formatting. //! This file deals with updating the actual message, including proper formatting.
use log::{debug, trace}; use log::{debug, trace};
use mpris::{MetadataValue}; use mpris::MetadataValue;
use crate::structs::{config::Config, data::Data}; use crate::structs::{config::Config, data::Data};

View File

@ -32,7 +32,7 @@ fn update_prefix(cfg: &Config, data: &mut char, name: &str) {
/// pf: PlayerFinder instance of the program. /// pf: PlayerFinder instance of the program.
/// cfg: Config struct of the program, containing the list of acceptable players. /// cfg: Config struct of the program, containing the list of acceptable players.
/// data: mutable Data struct of the program, containing a marker for the currently active player. /// data: mutable Data struct of the program, containing a marker for the currently active player.
pub fn update_players(pf: &PlayerFinder, cfg: &Config, mut data: &mut Data) { pub fn update_players(pf: &PlayerFinder, cfg: &Config, data: &mut Data) {
// get all acceptable players // get all acceptable players
let players = pf.find_all().unwrap_or(Vec::new()); let players = pf.find_all().unwrap_or(Vec::new());
if players.is_empty() { if players.is_empty() {