Fun with figlets!
I had a little bit of fun with figlets the past few days. I came to the conclusion that they could be useful in seperating sections in Rust code. Generally, I find navigating in Rust a bit more difficult than C++, might be because I am not used to it, or because definitions and declarations tend to be gobbled together, and also enums and structures are generally more complex in Rust and C++.
I realised though that figlets could be used as sections titles, like in the following snippet:
// ___ _ __ __
// |_ _|_ __ _ __ _ _| |_| \/ | ___ ___ ___ __ _ __ _ ___
// | || '_ \| '_ \| | | | __| |\/| |/ _ \/ __/ __|/ _` |/ _` |/ _ \
// | || | | | |_) | |_| | |_| | | | __/\__ \__ \ (_| | (_| | __/
// |___|_| |_| .__/ \__,_|\__|_| |_|\___||___/___/\__,_|\__, |\___|
// |_| |___/
/// Input messages to the decision module
#[derive(Clone)]
pub enum InputMessage
{
/// Request to take a decision on a CFP
DecideCFPAcceptance
{
/// CFP
cfp: delegation::CFP,
},
/// Queue the execution of a task
QueueExecution
{
/// uuid of the task
uuid: Vec<u8>,
},
}
// ___ _ _ __ __
// / _ \ _ _| |_ _ __ _ _| |_| \/ | ___ ___ ___ __ _ __ _ ___
// | | | | | | | __| '_ \| | | | __| |\/| |/ _ \/ __/ __|/ _` |/ _` |/ _ \
// | |_| | |_| | |_| |_) | |_| | |_| | | | __/\__ \__ \ (_| | (_| | __/
// \___/ \__,_|\__| .__/ \__,_|\__|_| |_|\___||___/___/\__,_|\__, |\___|
// |_| |___/
/// Output messages of the decision module
#[derive(Clone)]
pub enum OutputMessage
{
/// Proposal for a CFP
CFPProposal
{
/// Proposal for a CFP
proposal: delegation::Proposal,
},
/// Result of queuing the execution of a task
QueueExecutionResult
{
/// uuid of the task
uuid: Vec<u8>,
/// True if the execution was accepted and queued
accepted: bool,
},
}
But then, I found it tedious to create those banners, by either using command line to generate a figlet or a website and then commenting the block. So I thought it could be fun to create a small command line tool to generate those banners for me. Simple enough, here came figlet-comment. Implemented in Rust, it originally used the figlet-rs library. Just for the fun of a pure rust solution.
And then it was just a matter of running the following command:
figlet-comment Some text!
To get a banner with comment, ready to insert in the code:
// ____ _ _ _
// / ___| ___ _ __ ___ ___ | |_ ___ __ __ | |_ | |
// \___ \ / _ \ | '_ ` _ \ / _ \ | __| / _ \ \ \/ / | __| | |
// ___) | | (_) | | | | | | | | __/ | |_ | __/ > < | |_ |_|
// |____/ \___/ |_| |_| |_| \___| \__| \___| /_/\_\ \__| (_)
//
Unfortunatelly, as you can see, there are some spacing between the lettters. The figlet-rs
library does not support kerning (or smooshing) :( I thought how hard can it be to support kerning?. It is actually relatively easy for figlets, it is well described in the FIGfonts specification.
It was a matter of:
- computing the kerning
- smooshing the characters together
The smooshing rules are well defined in the spec. To compute the kerning, it was a simple question of:
- computing how many symbols to remove in the left and in the right character for every line.
- selecting the smallest number of characters
For the smooshing, line-by-line,
The code for using figlets with kerning in pure rust can be found in the figleter crate.
And lead to the following output:
// ____ _ _ _
// / ___| ___ _ __ ___ ___ | |_ _____ __ |_| |
// \___ \ / _ \| '_ ` _ \ / _ \ | __/ _ \ \/ / __| |
// ___) | (_) | | | | | | __/ | || __/> <| |_|_|
// |____/ \___/|_| |_| |_|\___| \__\___/_/\_\\__(_)
//