libime_history_merge/
data_text.rs1use serde::Deserialize;
2
3use crate::{
4 data::{History, Pool, Sentence, Word},
5 de::StringVisitor,
7 de_text::{SpaceSeparatedVisitor, TextDeserializer},
8 Result,
9};
10
11impl History {
12 pub fn load_from_text(content: &[u8]) -> Result<Self> {
15 let mut deserializer = TextDeserializer::new(content);
16 let mut sentences: Vec<SentenceFromText> = Vec::new();
17 while !deserializer.ended() {
18 let sft = SentenceFromText::deserialize(&mut deserializer)?;
19 sentences.push(sft);
20 }
21 let sentences = sentences
22 .into_iter()
23 .map(Sentence::from)
24 .filter(|sentence| !sentence.is_empty())
25 .collect();
26 let pools = vec![Pool(sentences)];
27 Ok(History::new(pools))
28 }
29}
30
31#[derive(Clone, Debug, Default, PartialEq, PartialOrd)]
32pub struct WordFromText(
33 pub String,
35);
36
37impl From<WordFromText> for Word {
38 fn from(wft: WordFromText) -> Self {
39 Word(wft.0)
40 }
41}
42
43impl<'de> Deserialize<'de> for WordFromText {
44 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
45 where
46 D: serde::Deserializer<'de>,
47 {
48 Ok(WordFromText(
49 deserializer.deserialize_string(StringVisitor)?,
50 ))
51 }
52}
53
54#[derive(Clone, Debug, Default, PartialEq, PartialOrd)]
55pub struct SentenceFromText(pub Vec<WordFromText>);
56
57impl From<SentenceFromText> for Sentence {
58 fn from(sft: SentenceFromText) -> Self {
59 Sentence(sft.0.into_iter().map(Word::from).collect())
60 }
61}
62
63impl<'de> Deserialize<'de> for SentenceFromText {
64 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
65 where
66 D: serde::Deserializer<'de>,
67 {
68 Ok(SentenceFromText(
69 deserializer.deserialize_seq(SpaceSeparatedVisitor::new())?,
70 ))
71 }
72}