libime_history_merge/
data_text.rs

1use serde::Deserialize;
2
3use crate::{
4    data::{History, Pool, Sentence, Word},
5    //de_text::{SequenceVisitor, StringVisitor},
6    de::StringVisitor,
7    de_text::{SpaceSeparatedVisitor, TextDeserializer},
8    Result,
9};
10
11impl History {
12    /// Load a history object from a newline-separated text buffer.  Each line should be a
13    /// space-separated collection of words.  Empty lines are ignored.
14    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    /// Use `String` here because it is read from dumped `user.history` so it must be valid UTF-8.
34    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}