package term
import "core:fmt"
import "core:strings"
Style :: struct {
fg: Maybe(int),
bg: Maybe(int),
bold: bool,
}
current_style: Style // what the terminal currently has active
reset_style :: proc(sb:^strings.Builder) {
apply_style(sb, {})
}
apply_style :: proc(sb: ^strings.Builder, target: Style) {
if target == current_style {
return
}
codes: [dynamic; 8]string
if target.bold != current_style.bold {
append(&codes, target.bold ? "1" : "22")
}
if target.fg != current_style.fg {
if fg, ok := target.fg.?; ok {
append(&codes, fmt.tprintf("%d", fg))
} else {
append(&codes, "39")
}
}
if target.bg != current_style.bg {
if bg, ok := target.bg.?; ok {
append(&codes, fmt.tprintf("%d", bg))
} else {
append(&codes, "49")
}
}
if len(codes) > 0 {
strings.write_string(sb, fmt.tprintf("\x1b[%sm", strings.join(codes[:], ";")))
}
current_style = target
}