easyconf-lemonbar/config_parsing.py

91 lines
3.7 KiB
Python

from yaml import dump, safe_load
from schema import And, Optional, Regex, Schema, SchemaError, Or
from json import dumps
def get_validated_config(filename):
config_schema = Schema({
"bar": {
Optional("config"): {
Optional("geometry"): Regex(r'^[0-9]*x[0-9]*\+[0-9]*\+[0-9]*$'),
Optional("bottom"): bool,
Optional("force"): bool,
Optional("font"): str,
Optional("name"): str,
Optional("line_thickness"): And(int, lambda n: n > 0),
Optional("bg_color", default="#000"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("fg_color", default="#FFF"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("offset"): int,
Optional("line_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("padding", default=" "): str,
Optional("seperator", default="|"): str
},
"modules": [
{
str: {
"command": str,
"refresh": And(int, lambda n : n > 0),
Optional("prefix"): str,
"format": {
"align": Or("left", "center", "right"),
Optional("bg_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("fg_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("font"): And(int, lambda n: 1 <= n <= 5),
Optional("offset"): int,
Optional("line"): {
"type": Or("underline", "overline"),
Optional("color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$')
},
Optional("button"): {
"activator": Or("left", "center", "right", "scrup", "scrdown"),
"command": str
}
}
}
}
]
}
})
with open(filename, "r", encoding="utf8") as file:
config_file = safe_load(file)
try:
return config_schema.validate(config_file)
except SchemaError as se:
raise se
def get_lemonbar_flags(config):
configuration_options = config["bar"]["config"]
flags = ""
for option in configuration_options:
match option:
case 'geometry':
flags += (" -g '" + configuration_options[option] + "'")
case 'bottom':
flags += (" -b")
case 'force':
flags += (" -d")
case 'font':
flags += (" -f '" + configuration_options[option] + "'")
case 'name':
flags += (" -n '" + configuration_options[option] + "'")
case 'line_thickness':
flags += (" -u " + str(configuration_options[option]))
case 'bg_color':
flags += (" -B '" + configuration_options[option] + "'")
case 'fg_color':
flags += (" -F '" + configuration_options[option] + "'")
case 'offset':
flags += (" -o " + str(configuration_options[option]))
case 'line_color':
flags += (" -U '" + configuration_options[option] + "'")
return flags.strip()
print(get_lemonbar_flags(get_validated_config("./testing_config.yml")))