From 4513c6626a34f737482c102825be7c2ca1b43eff Mon Sep 17 00:00:00 2001 From: stuebinm Date: Wed, 23 Jun 2021 18:20:26 +0200 Subject: initial commit --- symbolmacro/src/lib.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 symbolmacro/src/lib.rs (limited to 'symbolmacro/src/lib.rs') diff --git a/symbolmacro/src/lib.rs b/symbolmacro/src/lib.rs new file mode 100644 index 0000000..f99ccd9 --- /dev/null +++ b/symbolmacro/src/lib.rs @@ -0,0 +1,53 @@ + +extern crate proc_macro; + +use proc_macro::TokenStream; +use std::{collections::HashMap, fs::File, io::BufReader}; +use std::io::prelude::*; + + + +fn fetchsymbols() -> HashMap { + // who needs obvious filepaths, anyways? + let filename = "symbols"; + let file = File::open(filename).unwrap(); + let reader = BufReader::new(file); + + reader.lines() + .filter_map(|l| l.ok()) + .filter_map(|l| { + let segments: Vec<&str> = l + .split_whitespace() + .collect(); + match segments[..] { + [] => None, + [s,"code:",code,..] => { + let codepoint = u32::from_str_radix(&code[2..], 16).ok()?; + let unichar = std::char::from_u32(codepoint)?; + Some((s[2..s.len()-1].to_string(), unichar)) + }, + _ => None, + } + }) + .collect::>() +} + + +// rust macros are a strange kind of horrible, tbh +#[proc_macro] +pub fn make_symbols(_item: TokenStream) -> TokenStream { + let symbols = fetchsymbols(); + + format!( + "fn symbol(key: &str) -> Option<&'static str> {{ + match key {{ + {} + _ => None + }} + }}", + symbols.iter() + .map(|(k,v)| format!("\"{}\" => Some(\"{}\"),",k,v)) + .collect::>() + .join("\n") + ).parse().unwrap() +} -- cgit v1.2.3