From 81d9b81b064e12d85888d45460cb16ea0765a8e4 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 21 Dec 2019 04:55:10 +0000 Subject: [PATCH] feat(cheddar): Use syntax highlighting assets from bat 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?! --- third_party/default.nix | 1 + tools/cheddar/default.nix | 19 ++++++++++++++++++- tools/cheddar/src/main.rs | 3 ++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/third_party/default.nix b/third_party/default.nix index afe05ccb5..aade83074 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.` inherit (nixpkgs) bashInteractive + bat buildGoPackage cacert cachix diff --git a/tools/cheddar/default.nix b/tools/cheddar/default.nix index 190a05c80..ed4814be0 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 1d58bb2ad..9cf853857 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) -> 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();