Completed basic functions of universal string.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s

This commit is contained in:
2026-03-16 08:56:47 -04:00
parent 7d8de156c7
commit 2f078bdf32

View File

@@ -584,39 +584,23 @@ struct UniversalString {
} }
impl UniversalString { impl UniversalString {
fn split_string(text: String) -> Vec<String> { fn new(lang: Language, text: String) -> Self {
let holder = text.as_str(); let mut output = Self {
let mut output = Vec::new(); paragraphs: HashMap::new(),
for item in holder.split("\u{2029}") { revisions: Vec::new(),
output.push(item.to_string()); };
} output.update(lang, text);
output output
} }
fn new(lang: Language, text: String) -> Self { fn get(&self, lang: &Language) -> Option<String> {
let input = Self::split_string(text); let latest = self.revisions.len() - 1;
let mut paragraphs = HashMap::new(); self.get_revision(latest, lang)
let mut revision = Vec::new();
for paragraph in input {
let mut id = Uuid::new_v4();
while paragraphs.contains_key(&id) {
id = Uuid::new_v4();
}
if paragraph != "" {
revision.push(id.clone());
paragraphs.insert(id, Paragraph::new(lang.clone(), paragraph.to_string()));
}
}
Self {
paragraphs: paragraphs,
revisions: vec![revision],
}
} }
fn get(&self, lang: &Language) -> Option<String> { fn get_revision(&self, rev_num: usize, lang: &Language) -> Option<String> {
let latest = self.revisions.iter().last().unwrap();
let mut output = "".to_string(); let mut output = "".to_string();
for id in latest.iter() { for id in self.revisions[rev_num].iter() {
let paragraph = self.paragraphs.get(id).unwrap(); let paragraph = self.paragraphs.get(id).unwrap();
let text = paragraph.get(lang).unwrap(); let text = paragraph.get(lang).unwrap();
output += text; output += text;
@@ -630,14 +614,12 @@ impl UniversalString {
} }
fn update(&mut self, lang: Language, text: String) { fn update(&mut self, lang: Language, text: String) {
let input = Self::split_string(text);
let mut version = Vec::new(); let mut version = Vec::new();
for paragraph in input { for paragraph in text.as_str().split("\u{2029}") {
if paragraph != "" { if paragraph != "" {
let mut id = Uuid::nil(); let mut id = Uuid::nil();
for (key, value) in self.paragraphs.iter() { for (key, value) in self.paragraphs.iter() {
if &paragraph == value.get(&lang).unwrap() { if &paragraph == value.get(&lang).unwrap() {
println!("--- Got here ---");
id = key.clone(); id = key.clone();
break; break;
} }
@@ -736,5 +718,50 @@ mod universal_strings {
assert_eq!(ustr.get(&lang).unwrap(), expected); assert_eq!(ustr.get(&lang).unwrap(), expected);
assert_eq!(ustr.revision_count(), 1); assert_eq!(ustr.revision_count(), 1);
assert_eq!(ustr.paragraphs.len(), data.len(), "{:?}", ustr); assert_eq!(ustr.paragraphs.len(), data.len(), "{:?}", ustr);
assert_eq!(ustr.get_revision(0, &lang).unwrap(), initial);
}
#[test]
fn can_a_paragraph_be_replaced() {
let (lang, mut data) = TestData::english();
let initial = TestData::to_input(data.clone());
let mut ustr = UniversalString::new(lang.clone(), initial.clone());
let position = random_range(..data.len());
data[position] = "replaced".to_string();
let expected = TestData::to_input(data.clone());
ustr.update(lang.clone(), expected.clone());
assert_eq!(ustr.get(&lang).unwrap(), expected);
assert_eq!(ustr.revision_count(), 1);
assert_eq!(ustr.paragraphs.len(), (data.len() + 1), "{:?}", ustr);
assert_eq!(ustr.get_revision(0, &lang).unwrap(), initial);
}
#[test]
fn does_not_store_duplicate_data() {
let lang = Language::from_639_1("en").unwrap();
let mut data = Vec::new();
for _ in 0..3 {
data.push("same".to_string());
}
let initial = TestData::to_input(data.clone());
let mut ustr = UniversalString::new(lang.clone(), initial.clone());
assert_eq!(ustr.get(&lang).unwrap(), initial);
assert_eq!(ustr.paragraphs.len(), 1, "{:?}", ustr);
}
#[test]
fn can_text_be_removed() {
let (lang, mut data) = TestData::english();
let expected_paragraphs = data.len();
let initial = TestData::to_input(data.clone());
let mut ustr = UniversalString::new(lang.clone(), initial.clone());
let position = random_range(..data.len());
data.remove(position);
let expected = TestData::to_input(data.clone());
ustr.update(lang.clone(), expected.clone());
assert_eq!(ustr.get(&lang).unwrap(), expected);
assert_eq!(ustr.revision_count(), 1);
assert_eq!(ustr.paragraphs.len(), expected_paragraphs, "{:?}", ustr);
assert_eq!(ustr.get_revision(0, &lang).unwrap(), initial);
} }
} }