Home >Backend Development >C++ >Wombat - Syntax Highlighting with Rusts Bat Called from Crystal
Introduction
This article explores using the Rust-based command-line tool bat
as a library within Crystal, a language currently lacking a robust syntax highlighting library. bat
, similar to cat
, displays file contents but offers enhanced features like line numbering, syntax highlighting, and pagination.
<code>bat hello.rb</code>
Leveraging bat
as a library addresses this Crystal limitation.
bat
as a Rust Library
bat
's PrettyPrinter
struct enables its use as a Rust library. However, bat
's reliance on the complex Syntect library for syntax highlighting initially presented a challenge. To simplify this, a print_with_writer
function was added to PrettyPrinter
, allowing direct string syntax highlighting. This addition was contributed via a pull request and is available from bat
version 0.25.0 onwards.
<code class="language-rust">use bat::PrettyPrinter; // ... code utilizing print_with_writer ...</code>
Creating a C Wrapper: bat-c
Because Rust libraries cannot be directly called from Crystal, a lightweight C wrapper library, bat-c
, was created. This allows bat
to be accessed from Crystal and other languages with C interoperability. The development of bat-c
heavily utilized ChatGPT and Copilot due to the author's limited Rust and C expertise. The bat-c
repository is available at: https://www.php.cn/link/065982e894fcde21153454b2ea4b2a8a
Key considerations in building bat-c
included:
Cargo.toml
to generate both dynamic (cdylib
) and static (staticlib
) libraries, enabling flexibility in usage. rpath = true
allows relative path library location. Release profile optimization using LTO and codegen-units = 1
.bat_c_version
) was added, storing the version in static memory for easy access.cargo publish
was avoided as bat-c
is a purely C library.Calling bat-c
from Crystal: wombat
A Crystal library, wombat
, was developed to simplify the interaction with bat-c
. The primary challenge was managing the bat-c
library download and placement. Since bat-c
is not yet widely distributed, a direct download from GitHub Releases was chosen. A static library was preferred for its seamless integration with Crystal. The download process is handled via a shards
post_install hook, employing curl
(Unix-like) or a batch script (Windows).
Usage Examples
The wombat
library provides functions for:
pretty_print_file
: Syntax highlighting a file.pretty_print
: Syntax highlighting a string.pretty_string
: Returns a highlighted string.<code>bat hello.rb</code>
GitHub Actions Workflow
Areas for Improvement
Despite these areas for improvement, the project successfully achieves its primary goal: enabling easy and maintainable use of bat
within Crystal. The author welcomes contributions and issue reports.
(Original Japanese post on Qiita: Wombat - RustのBatをCrystalから呼び出しシンタックスハイライティングする. English translation by ChatGPT.)
The above is the detailed content of Wombat - Syntax Highlighting with Rusts Bat Called from Crystal. For more information, please follow other related articles on the PHP Chinese website!