#[macro_use] extern crate serde_derive; extern crate phf_codegen; extern crate serde; extern crate serde_json; use std::env; use std::fs::File; use std::io::{BufWriter, Read, Write}; use std::path::Path; #[derive(Deserialize)] struct Emoji { #[serde(rename(deserialize = "char"))] character: String, name: String, } fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let path = Path::new(&out_dir).join("emojis.rs"); let mut file = BufWriter::new(File::create(&path).unwrap()); let mut emoji_file = File::open("emojis.json").expect("Can't open emoji file"); let mut buffer = String::new(); emoji_file .read_to_string(&mut buffer) .expect("Can't read emoji file"); let emojis: Vec = serde_json::from_str(&buffer).expect("Invalid JSON in emoji file"); write!( &mut file, "/// Compile time generated lookup table for Emojis.\n" ) .unwrap(); write!(&mut file, "/// \n").unwrap(); write!( &mut file, "static EMOJIS: phf::Map = " ) .unwrap(); let mut m = phf_codegen::Map::new(); assert!(emojis.len() >= 256); for (idx, emoji) in emojis.iter().enumerate().take(256) { let out = format!("({:?}, {:?})", emoji.character, emoji.name); m.entry(idx as u8, &out); } m.build(&mut file).unwrap(); write!(&mut file, ";\n").unwrap(); write!( &mut file, "/// Compile time generated reverse lookup table for Emojis.\n" ) .unwrap(); write!(&mut file, "/// \n").unwrap(); write!( &mut file, "static EMOJIS_REVERSE: phf::Map<&'static str, u8> = " ) .unwrap(); let mut m = phf_codegen::Map::new(); assert!(emojis.len() >= 256); for (idx, emoji) in emojis.iter().enumerate().take(256) { m.entry(emoji.character.as_str(), &format!("{}u8", idx as u8)); } m.build(&mut file).unwrap(); write!(&mut file, ";\n").unwrap(); }