music21/common/classtools.rs
1//! music21's `common.classTools`, as far as it is not about Python objects.
2
3/// The class name in the text Python writes for a class, as music21's
4/// `classToClassStr` cuts it out: whatever follows the last dot, less the
5/// closing quote and bracket. A class with no module in its name keeps
6/// the rest of the text, as music21's does.
7///
8/// ```
9/// use music21::common::classtools::class_to_class_str;
10///
11/// assert_eq!(class_to_class_str("<class 'music21.note.Note'>"), "Note");
12/// assert_eq!(class_to_class_str("<class 'int'>"), "<class 'int");
13/// ```
14pub fn class_to_class_str(text: &str) -> String {
15 let last = text.rsplit('.').next().unwrap_or(text);
16 let kept = last.chars().count().saturating_sub(2);
17 last.chars().take(kept).collect()
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23
24 /// Python slices characters, not bytes, and an empty slice is empty.
25 #[test]
26 fn class_names_are_cut_by_characters() {
27 assert_eq!(class_to_class_str("<class 'ß.Größe'>"), "Größe");
28 assert_eq!(class_to_class_str("'>"), "");
29 assert_eq!(class_to_class_str(">"), "");
30 assert_eq!(class_to_class_str("a.b.c'>"), "c");
31 }
32}