about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2019-07-14T16·12-0400
committerGriffin Smith <root@gws.fyi>2019-07-14T16·12-0400
commit67d18b486c6376c7637b3494722ddf1eb525288c (patch)
treea2c7c415e685a00ca005df9ff643c162f772d9a6
parent405dbffe376b05af31dc57f027658c70b4fb9634 (diff)
Factor out static_cfg from static init of messages
Factor out a macro for static references to data parsed from config
files at compile-time.
-rw-r--r--src/main.rs11
-rw-r--r--src/messages.rs7
-rw-r--r--src/util/mod.rs2
-rw-r--r--src/util/static_toml.rs37
4 files changed, 45 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index 8d7222106c..e09563b16c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -25,9 +25,10 @@ mod game;
 #[macro_use]
 mod types;
 mod entities;
+#[macro_use]
+mod util;
 mod messages;
 mod settings;
-mod util;
 
 use clap::App;
 use game::Game;
@@ -49,13 +50,9 @@ fn init(
     h: u16,
 ) {
     panic::set_hook(if settings.logging.print_backtrace {
-        Box::new(|info| {
-            (error!("{}\n{:#?}", info, Backtrace::new()))
-        })
+        Box::new(|info| (error!("{}\n{:#?}", info, Backtrace::new())))
     } else {
-        Box::new(|info| {
-            (error!("{}\n{:#?}", info, Backtrace::new()))
-        })
+        Box::new(|info| (error!("{}\n{:#?}", info, Backtrace::new())))
     });
 
     let game = Game::new(settings, stdout, stdin, w, h);
diff --git a/src/messages.rs b/src/messages.rs
index 03a96b4a0a..948787f139 100644
--- a/src/messages.rs
+++ b/src/messages.rs
@@ -165,11 +165,8 @@ choice = ["Say this", "Or this"]
     }
 }
 
-static MESSAGES_RAW: &'static str = include_str!("messages.toml");
-
-lazy_static! {
-    static ref MESSAGES: NestedMap<'static> =
-        toml::from_str(MESSAGES_RAW).unwrap();
+static_cfg! {
+    static ref MESSAGES: NestedMap<'static> = toml_file("messages.toml");
 }
 
 /// Look up a game message based on the given (dot-separated) name, with the
diff --git a/src/util/mod.rs b/src/util/mod.rs
index e69de29bb2..e26eae2b89 100644
--- a/src/util/mod.rs
+++ b/src/util/mod.rs
@@ -0,0 +1,2 @@
+#[macro_use]
+pub mod static_toml;
diff --git a/src/util/static_toml.rs b/src/util/static_toml.rs
new file mode 100644
index 0000000000..7a930ee023
--- /dev/null
+++ b/src/util/static_toml.rs
@@ -0,0 +1,37 @@
+macro_rules! __static_cfg_parse {
+    (toml_file, $e:expr) => {
+        toml::from_str($e)
+    };
+
+    (json_file, $e:expr) => {
+        json::from_str($e)
+    };
+}
+
+macro_rules! __static_cfg_inner {
+    ($(#[$attr:meta])* ($($vis:tt)*) static ref $N:ident : $T:ty = $kind:ident($filename:expr); $($t:tt)*) => {
+        static RAW: &'static str = include_str!($filename);
+        lazy_static! {
+            $(#[$attr])* static ref $N: $T = __static_cfg_parse!($kind, RAW).unwrap();
+        }
+
+        static_cfg!($($t)*);
+    }
+}
+
+#[macro_export]
+macro_rules! static_cfg {
+    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $kind:ident($filename:expr); $($t:tt)*) => {
+        __static_cfg_inner!($(#[$attr])* () static ref $N : $T = $kind($filename); $($t)*);
+    };
+
+    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $kind:ident($filename:expr); $($t:tt)*) => {
+        __static_cfg_inner!($(#[$attr])* (pub) static ref $N : $T = $kind($filename); $($t)*);
+    };
+
+    ($(#[$attr:meta])* pub ($($vis:tt)+) static ref $N:ident : $T:ty = $kind:ident($filename:expr); $($t:tt)*) => {
+        __static_cfg_inner!($(#[$attr])* (pub ($($vis)+)) static ref $N : $T = $kind($filename); $($t)*);
+    };
+
+    () => ()
+}