SSCCPP, the Simple Switch Cases Configuration PreProcessor
source link: https://www.tuicool.com/articles/zYVvUz6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
SSCCPP, the Simple Switch Cases Configuration PreProcessor
This small utility makes it easy to have a single file that can be adapted to different cases.
Typical use is to manage dotfiles, by allowing to have only one git branch where each file clearly shows its variation between your different machines.
It is written in Rust and provides a library as well as two binaries: ssccpp
and ssccpp-batch
. ssccpp
processes a single file while ssccpp-batch
process all files in a directory, copying its structure to an other one.
Table of Content
Concept
ssccpp
works on a file where some lines have been turned into switch statements.
These switch statements are recognized by looking for a delimiter (by default >>>>>>>>
ie. 8 times the '>' character).
A switch block is composed of, in order:
>>>>>>>> ident1, ident2, ... >>>>>>>> * >>>>>>>>
When reaching such a block, ssccpp will check, for each specific
case if one of the ident
matches the searched ident (by default the hostname), and if yes, will emit the text that follows.
When reaching the otherwise
block, it will emit the text that follows if none of the specific
statements before were entered. Finally, when reaching the ending delimiter, it will print all following text, until a new block is encountered.
Examples
First example
This line will be displayed everywhere. >>>>>>>> foo, bar This line will be displayed on foo and bar only. >>>>>>>> ga, bu, zo This line will be displayed on ga, bu and zo, but not foo or bar. >>>>>>>> foo, zo This line will be displayed on foo and zo. >>>>>>>> * This line will be displayed on anything that is not foo, bar, ga, bu or zo. >>>>>>>> This line will be displayed everywhere.
Configuration files example
In this example, the user has a dotfiles
directory that mimics the structure of their /home/user
directory:
dotfiles/ ├── scripts/ │ └── wallpaper.sh └── .xinitrc
The file content is as follow:
wallpaper.sh
>>>>>>>> laptop feh --bg-scale 'Images/WallpaperLaptop.png' >>>>>>>> * feh --bg-scale 'Images/DefaultWallpaper.png'
.xinitrc
>>>>>>>> desktop xrandr --dpi 166 >>>>>>>> laptop xrandr --dpi 96 >>>>>>>> exec i3
Upon executing ssccpp-batch dotfiles/ /home/user --ident laptop
the files will be placed with the same structure in their home directory and become:
wallpaper.sh
feh --bg-scale 'Images/WallpaperLaptop.png'
.xinitrc
xrandr --dpi 96 exec i3
and upon executing ssccpp-batch dotfiles/ /home/user --ident desktop
the files will become:
wallpaper.sh
feh --bg-scale 'Images/DefaultWallpaper.png'
.xinitrc
xrandr --dpi 166 exec i3
Install
Cargo
Build from the sources using cargo
cargo install ssccpp
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK