From d1e55252d0795a0a28e5269a6a68cfafe3a6b51c Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Thu, 22 May 2025 11:49:56 +1000 Subject: [PATCH] [lvgl] Improve error messages from text validation (#8872) --- esphome/components/lvgl/schemas.py | 54 +++++++++++++++++++----------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/esphome/components/lvgl/schemas.py b/esphome/components/lvgl/schemas.py index 18756d0129..2bae560041 100644 --- a/esphome/components/lvgl/schemas.py +++ b/esphome/components/lvgl/schemas.py @@ -36,29 +36,43 @@ from .types import ( # this will be populated later, in __init__.py to avoid circular imports. WIDGET_TYPES: dict = {} +TIME_TEXT_SCHEMA = cv.Schema( + { + cv.Required(CONF_TIME_FORMAT): cv.string, + cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)), + } +) + +PRINTF_TEXT_SCHEMA = cv.All( + cv.Schema( + { + cv.Required(CONF_FORMAT): cv.string, + cv.Optional(CONF_ARGS, default=list): cv.ensure_list(cv.lambda_), + }, + ), + validate_printf, +) + + +def _validate_text(value): + """ + Do some sanity checking of the format to get better error messages + than using cv.Any + """ + if value is None: + raise cv.Invalid("No text specified") + if isinstance(value, dict): + if CONF_TIME_FORMAT in value: + return TIME_TEXT_SCHEMA(value) + return PRINTF_TEXT_SCHEMA(value) + + return cv.templatable(cv.string)(value) + + # A schema for text properties TEXT_SCHEMA = cv.Schema( { - cv.Optional(CONF_TEXT): cv.Any( - cv.All( - cv.Schema( - { - cv.Required(CONF_FORMAT): cv.string, - cv.Optional(CONF_ARGS, default=list): cv.ensure_list( - cv.lambda_ - ), - }, - ), - validate_printf, - ), - cv.Schema( - { - cv.Required(CONF_TIME_FORMAT): cv.string, - cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)), - } - ), - cv.templatable(cv.string), - ) + cv.Optional(CONF_TEXT): _validate_text, } )