use bincode::SizeLimit;
use bincode::rustc_serialize::*;
use std::fs::File;
use std::io::{BufReader, BufWriter};
#[cfg(feature = "assets")]
use parsing::SyntaxSet;
#[cfg(feature = "assets")]
use highlighting::ThemeSet;
use std::path::Path;
use flate2::write::ZlibEncoder;
use flate2::read::ZlibDecoder;
use flate2::Compression;
use rustc_serialize::{Encodable, Decodable};
pub fn dump_binary<T: Encodable>(o: &T) -> Vec<u8> {
let mut v = Vec::new();
{
let mut encoder = ZlibEncoder::new(&mut v, Compression::Best);
encode_into(o, &mut encoder, SizeLimit::Infinite).unwrap();
}
v
}
pub fn dump_to_file<T: Encodable, P: AsRef<Path>>(o: &T, path: P) -> EncodingResult<()> {
let f = BufWriter::new(try!(File::create(path).map_err(EncodingError::IoError)));
let mut encoder = ZlibEncoder::new(f, Compression::Best);
encode_into(o, &mut encoder, SizeLimit::Infinite)
}
pub fn from_binary<T: Decodable>(v: &[u8]) -> T {
let mut decoder = ZlibDecoder::new(v);
decode_from(&mut decoder, SizeLimit::Infinite).unwrap()
}
pub fn from_dump_file<T: Decodable, P: AsRef<Path>>(path: P) -> DecodingResult<T> {
let f = try!(File::open(path).map_err(DecodingError::IoError));
let mut decoder = ZlibDecoder::new(BufReader::new(f));
decode_from(&mut decoder, SizeLimit::Infinite)
}
#[cfg(feature = "assets")]
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(feature = "assets")]
impl ThemeSet {
pub fn load_defaults() -> ThemeSet {
from_binary(include_bytes!("../assets/default.themedump"))
}
}
#[cfg(test)]
mod tests {
#[cfg(feature = "yaml-load")]
#[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);
let ps2: SyntaxSet = from_binary(&bin[..]);
assert_eq!(ps.syntaxes().len(), ps2.syntaxes().len());
}
#[cfg(feature = "assets")]
#[test]
fn has_default_themes() {
use highlighting::ThemeSet;
let themes = ThemeSet::load_defaults();
assert!(themes.themes.len() > 4);
}
}