about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-12-21T04·55+0000
committerVincent Ambo <tazjin@google.com>2019-12-21T04·55+0000
commit81d9b81b064e12d85888d45460cb16ea0765a8e4 (patch)
tree34f51c5c73cf8b80232ee772ced5405c86dca3f3
parent4681c07bde702f64d630f25ef831267cd9ac09ee (diff)
feat(cheddar): Use syntax highlighting assets from bat r/277
This uses Nix to inject the path to the syntax highlighting assets
that ship with the bat source code into the cheddar build at compile
time, where the Rust compiler then inserts it into the binary via
macros.

bat has a lot of custom syntax highlighting definitions that they
collected from all over the place (including for languages like Nix!)
and this makes them accessible to cheddar.

Also if you're reading this, can you just take a moment to appreciate
how incredible it is that Nix just lets us do something like this?!
-rw-r--r--third_party/default.nix1
-rw-r--r--tools/cheddar/default.nix19
-rw-r--r--tools/cheddar/src/main.rs3
3 files changed, 21 insertions, 2 deletions
diff --git a/third_party/default.nix b/third_party/default.nix
index afe05ccb52..aade830746 100644
--- a/third_party/default.nix
+++ b/third_party/default.nix
@@ -22,6 +22,7 @@ let
     # of the repo. They become available under `pkgs.third_party.<name>`
     inherit (nixpkgs)
       bashInteractive
+      bat
       buildGoPackage
       cacert
       cachix
diff --git a/tools/cheddar/default.nix b/tools/cheddar/default.nix
index 190a05c805..ed4814be0a 100644
--- a/tools/cheddar/default.nix
+++ b/tools/cheddar/default.nix
@@ -1,3 +1,20 @@
 { pkgs, ... }:
 
-pkgs.third_party.naersk.buildPackage ./.
+with pkgs.third_party;
+
+naersk.buildPackage {
+  src = ./.;
+  doDoc = false;
+  doCheck = false;
+
+  override = x: {
+    # bat contains syntax highlighting packages for a lot more
+    # languages than what ships with syntect, and we can make use of
+    # them!
+    BAT_SYNTAXES = "${bat.src}/assets/syntaxes.bin";
+
+    # LLVM packages (why are they even required?) are not found
+    # automatically if added to buildInputs, hence this ...
+    LIBCLANG_PATH = "${llvmPackages.libclang}/lib/libclang.so.7";
+  };
+}
diff --git a/tools/cheddar/src/main.rs b/tools/cheddar/src/main.rs
index 1d58bb2ad4..9cf8538570 100644
--- a/tools/cheddar/src/main.rs
+++ b/tools/cheddar/src/main.rs
@@ -4,6 +4,7 @@ use std::io::BufRead;
 use std::io;
 use std::path::Path;
 use syntect::easy::HighlightLines;
+use syntect::dumps::from_binary;
 use syntect::highlighting::ThemeSet;
 use syntect::parsing::{SyntaxSet, SyntaxReference};
 
@@ -35,7 +36,7 @@ fn should_continue(res: &io::Result<usize>) -> bool {
 }
 
 fn main() {
-    let syntaxes = SyntaxSet::load_defaults_newlines();
+    let syntaxes = from_binary(include_bytes!(env!("BAT_SYNTAXES")));
 
     let stdin = io::stdin();
     let mut stdin = stdin.lock();