xxxxxxxxxx
import std.format;
import std.stdio;
enum Modes {
black = "\033[30m",
red = "\033[31m",
green = "\033[32m",
yellow = "\033[33m",
blue = "\033[34m",
magenta = "\033[35m",
cyan = "\033[36m",
white = "\033[37m",
bold = "\033[1m",
underline = "\033[4m",
}
static foreach (mode; __traits(allMembers, Modes)) {
mixin("auto "~mode~"(T)(T value) { return WrappedAnsi!(T, \""~__traits(getMember, Modes, mode)~"\")(value); }");
}
struct WrappedAnsi(T, string prefix) {
T value;
void doToString(W)(scope W sink, FormatSpec!char fmt, bool nested) {
sink(prefix);
static if (is(T == WrappedAnsi!Args, Args...)) {
value.doToString(sink, fmt, true);
} else {
formatValue(sink, value, fmt);
}
if (!nested)
sink("\033[0m");
}
void toString(W)(scope W sink, FormatSpec!char fmt) {
doToString(sink, fmt, false);
}
}
void main() {
writefln("Blue float '%s', red bold string '%s', underline bold int: '%s'",
3.14f.blue,
"hello".red.bold,
42.bold.underline
);
}