use crate::{Dictionary, DictionaryNode, MappedDictionary};
use std::io::{Read, Write};
use super::{
extract_terms, extract_terms_with_values, extract_terms_with_values_char, DictionaryFromTerms,
DictionaryFromTermsWithValues, DictionarySerializer, SerializationError,
};
use crate::suffix_automaton::SuffixAutomaton;
pub struct BincodeSerializer;
impl BincodeSerializer {
pub fn serialize_suffix_automaton<W>(
automaton: &SuffixAutomaton,
mut writer: W,
) -> Result<(), SerializationError>
where
W: Write,
{
let texts = automaton.source_texts();
crate::serialization::bincode_compat::serialize_into(&mut writer, &texts)?;
Ok(())
}
pub fn deserialize_suffix_automaton<R>(
mut reader: R,
) -> Result<SuffixAutomaton, SerializationError>
where
R: Read,
{
let texts: Vec<String> =
crate::serialization::bincode_compat::deserialize_from(&mut reader)?;
Ok(SuffixAutomaton::from_texts(texts))
}
pub fn serialize_with_values<D, W>(dict: &D, mut writer: W) -> Result<(), SerializationError>
where
D: MappedDictionary,
D::Node: DictionaryNode<Unit = u8>,
D::Value: serde::Serialize,
W: Write,
{
let entries = extract_terms_with_values(dict);
crate::serialization::bincode_compat::serialize_into(&mut writer, &entries)?;
Ok(())
}
pub fn deserialize_with_values<D, R>(mut reader: R) -> Result<D, SerializationError>
where
D: DictionaryFromTermsWithValues,
D::Value: serde::de::DeserializeOwned,
R: Read,
{
let entries: Vec<(String, D::Value)> =
crate::serialization::bincode_compat::deserialize_from(&mut reader)?;
Ok(D::from_terms_with_values(entries))
}
pub fn serialize_with_values_char<D, W>(
dict: &D,
mut writer: W,
) -> Result<(), SerializationError>
where
D: MappedDictionary,
D::Node: DictionaryNode<Unit = char>,
D::Value: serde::Serialize,
W: Write,
{
let entries = extract_terms_with_values_char(dict);
crate::serialization::bincode_compat::serialize_into(&mut writer, &entries)?;
Ok(())
}
}
impl DictionarySerializer for BincodeSerializer {
fn serialize<D, W>(dict: &D, mut writer: W) -> Result<(), SerializationError>
where
D: Dictionary,
D::Node: DictionaryNode<Unit = u8>,
W: Write,
{
let terms = extract_terms(dict);
crate::serialization::bincode_compat::serialize_into(&mut writer, &terms)?;
Ok(())
}
fn deserialize<D, R>(mut reader: R) -> Result<D, SerializationError>
where
D: DictionaryFromTerms,
R: Read,
{
let terms: Vec<String> =
crate::serialization::bincode_compat::deserialize_from(&mut reader)?;
Ok(D::from_terms(terms))
}
}