diff options
| author | Miquel Sabaté Solà <mssola@mssola.com> | 2026-01-16 15:25:16 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <mssola@mssola.com> | 2026-01-19 21:56:29 +0100 |
| commit | 19d7c1eab58d9f02e41f831eda121ef587487858 (patch) | |
| tree | 172e23ff688c290a27328a60d7098fc20eb574f5 /crates/cli/src/words.rs | |
| parent | c40851cc007e8d5f0c12a4b77d370f0f6e4263a2 (diff) | |
| download | mihi-19d7c1eab58d9f02e41f831eda121ef587487858.tar.gz mihi-19d7c1eab58d9f02e41f831eda121ef587487858.zip | |
Display related words on the 'words show' command
This includes comparative/superlative/adverbial forms for adjectives,
and alternative forms because of gender or otherwise.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'crates/cli/src/words.rs')
| -rw-r--r-- | crates/cli/src/words.rs | 87 |
1 files changed, 86 insertions, 1 deletions
diff --git a/crates/cli/src/words.rs b/crates/cli/src/words.rs index 9ed16d3..181ea81 100644 --- a/crates/cli/src/words.rs +++ b/crates/cli/src/words.rs @@ -2,7 +2,10 @@ use crate::inflection::print_full_inflection_for; use crate::locale::current_locale; use inquire::{Confirm, Editor, Select, Text}; -use mihi::{Category, Gender, Language, Word}; +use mihi::{ + adverb, comparative, joint_related_words, select_related_words, superlative, Category, Gender, + Language, RelationKind, Word, +}; use std::vec::IntoIter; static NEW_MESSAGE: &str = "New word"; @@ -628,6 +631,43 @@ fn show_info(word: Word) -> Result<(), String> { } }; + // Show relationships with other words. + + let related = select_related_words(&word)?; + + if matches!(word.category, Category::Adjective) { + print!( + "Comparative: {} || ", + comparative(&word, &related[RelationKind::Comparative as usize - 1]) + ); + print!( + "Superlative: {} || ", + superlative(&word, &related[RelationKind::Superlative as usize - 1]) + ); + println!( + "Adverb: {}", + adverb(&word, &related[RelationKind::Adverb as usize - 1]) + ); + } + + let alternatives = &related[RelationKind::Alternative as usize - 1]; + match alternatives.len() { + 0 => {} + 1 => println!("Alternative: {}", joint_related_words(&alternatives)), + _ => println!("Alternatives: {}", joint_related_words(&alternatives)), + } + let gendered = &related[RelationKind::Gendered as usize - 1]; + let g = if matches!(word.gender, Gender::Masculine) { + "Feminine" + } else { + "Masculine" + }; + match gendered.len() { + 0 => {} + 1 => println!("{g} alternative: {}", joint_related_words(&gendered)), + _ => println!("{g} alternatives: {}", joint_related_words(&gendered)), + } + // Show translation if available. let locale = current_locale(); if let Some(translation) = word.translation.get(locale.to_code()) { @@ -759,3 +799,48 @@ pub fn run(args: Vec<String>) { } } } + +#[cfg(test)] +mod tests { + use super::*; + + // Returns a string with the format "{comparative form}-{superlative + // form}-{adverbial form}-{alternatives}-{gendered alternatives}". + fn related_for(enunciated: &str) -> String { + let word = mihi::find_by(enunciated).unwrap(); + let related = select_related_words(&word).unwrap(); + let alternatives = &related[RelationKind::Alternative as usize - 1]; + let gendered = &related[RelationKind::Gendered as usize - 1]; + + let first = if matches!(word.category, Category::Adjective) { + format!( + "{}-{}-{}", + comparative(&word, &related[RelationKind::Comparative as usize - 1]), + superlative(&word, &related[RelationKind::Superlative as usize - 1]), + adverb(&word, &related[RelationKind::Adverb as usize - 1]) + ) + } else { + "--".to_string() + }; + + format!( + "{}-{}-{}", + first, + mihi::joint_related_words(&alternatives), + mihi::joint_related_words(&gendered) + ) + } + + #[test] + fn related() { + assert_eq!( + related_for("parvus, parva, parvum"), + "minor, minus-minimus, minima, minimum-parvē--" + ); + assert_eq!( + related_for("versō, versāre, versāvī, versātum"), + "---vorsō, vorsāre, vorsāvī, vorsātum-" + ); + assert_eq!(related_for("victor, victōris"), "----victrīx, victrīcis"); + } +} |
