use bincode::Result;
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
use bincode::deserialize_from;
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
use bincode::serialize_into;
use std::fs::File;
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
use std::io::{BufReader, Read};
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
use std::io::{BufWriter, Write};
#[cfg(all(feature = "parsing", feature = "assets", any(feature = "dump-load", feature = "dump-load-rs")))]
use parsing::SyntaxSet;
#[cfg(all(feature = "assets", any(feature = "dump-load", feature = "dump-load-rs")))]
use highlighting::ThemeSet;
use std::path::Path;
#[cfg(feature = "dump-create")]
use flate2::write::ZlibEncoder;
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
use flate2::read::ZlibDecoder;
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
use flate2::Compression;
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
use serde::Serialize;
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
use serde::de::DeserializeOwned;
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
pub fn dump_to_writer<T: Serialize, W: Write>(to_dump: &T, output: W) -> Result<()> {
let mut encoder = ZlibEncoder::new(output, Compression::best());
serialize_into(&mut encoder, to_dump)
}
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
pub fn dump_binary<T: Serialize>(o: &T) -> Vec<u8> {
let mut v = Vec::new();
dump_to_writer(o, &mut v).unwrap();
v
}
#[cfg(any(feature = "dump-create", feature = "dump-create-rs"))]
pub fn dump_to_file<T: Serialize, P: AsRef<Path>>(o: &T, path: P) -> Result<()> {
let out = BufWriter::new(File::create(path)?);
dump_to_writer(o, out)
}
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
pub fn from_reader<T: DeserializeOwned, R: Read>(input: R) -> Result<T> {
let mut decoder = ZlibDecoder::new(input);
deserialize_from(&mut decoder)
}
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
pub fn from_binary<T: DeserializeOwned>(v: &[u8]) -> T {
from_reader(v).unwrap()
}
#[cfg(any(feature = "dump-load", feature = "dump-load-rs"))]
pub fn from_dump_file<T: DeserializeOwned, P: AsRef<Path>>(path: P) -> Result<T> {
let f = File::open(path)?;
let reader = BufReader::new(f);
from_reader(reader)
}
#[cfg(all(feature = "parsing", feature = "assets", any(feature = "dump-load", feature = "dump-load-rs")))]
impl SyntaxSet {
pub fn load_defaults_nonewlines() -> SyntaxSet {
let mut ps: SyntaxSet = from_binary(include_bytes!("../assets/default_nonewlines.\
packdump"));
ps.link_syntaxes();
ps
}
pub fn load_defaults_newlines() -> SyntaxSet {
let mut ps: SyntaxSet = from_binary(include_bytes!("../assets/default_newlines.packdump"));
ps.link_syntaxes();
ps
}
}
#[cfg(all(feature = "assets", any(feature = "dump-load", feature = "dump-load-rs")))]
impl ThemeSet {
pub fn load_defaults() -> ThemeSet {
from_binary(include_bytes!("../assets/default.themedump"))
}
}
#[cfg(test)]
mod tests {
#[cfg(all(feature = "yaml-load", any(feature = "dump-create", feature = "dump-create-rs"), any(feature = "dump-load", feature = "dump-load-rs")))]
#[test]
fn can_dump_and_load() {
use super::*;
use parsing::SyntaxSet;
let mut ps = SyntaxSet::new();
ps.load_syntaxes("testdata/Packages", false).unwrap();
let bin = dump_binary(&ps);
println!("{:?}", bin.len());
let ps2: SyntaxSet = from_binary(&bin[..]);
assert_eq!(ps.syntaxes().len(), ps2.syntaxes().len());
}
#[cfg(all(feature = "yaml-load", any(feature = "dump-create", feature = "dump-create-rs"), any(feature = "dump-load", feature = "dump-load-rs")))]
#[test]
fn dump_is_deterministic() {
use super::*;
use parsing::SyntaxSet;
let mut ps1 = SyntaxSet::new();
ps1.load_syntaxes("testdata/Packages", false).unwrap();
let bin1 = dump_binary(&ps1);
let mut ps2 = SyntaxSet::new();
ps2.load_syntaxes("testdata/Packages", false).unwrap();
let bin2 = dump_binary(&ps2);
assert_eq!(bin1, bin2);
}
#[cfg(all(feature = "assets", any(feature = "dump-load", feature = "dump-load-rs")))]
#[test]
fn has_default_themes() {
use highlighting::ThemeSet;
let themes = ThemeSet::load_defaults();
assert!(themes.themes.len() > 4);
}
}