Source code for jdxi_editor.log.parameter

"""parameter.py"""

import logging
from typing import Any

from jdxi_editor.globals import LOG_PADDING_WIDTH, LOGGING, logger
from jdxi_editor.log.decorator import decorate_log_message
from jdxi_editor.midi.io.utils import format_midi_message_to_hex_string


[docs] def log_parameter( message: str, parameter: Any, float_precision: int = 2, max_length: int = 300, level: int = logging.INFO, silent: bool = False, ): """ Log a structured representation of a parameter with type, formatted value, and optional emoji context. :param silent: bool suppress the log or not :param message: str The message to log. :param parameter: Any The parameter to log. :param float_precision: int The float precision. :param max_length: int The max length. :param level: int The log level. """ def format_value(param): if param is None: return "None" if isinstance(param, float): return f"{param:.{float_precision}f}" if isinstance(param, list): try: return format_midi_message_to_hex_string(param) except TypeError: return ", ".join(str(item) for item in param) if isinstance(param, dict): return ", ".join(f"{k}={v}" for k, v in param.items()) if isinstance(param, (bytes, bytearray)): return " ".join(f"0x{b:02X}" for b in param) return str(param) type_name = type(parameter).__name__ formatted_value = format_value(parameter) if len(formatted_value) > max_length: formatted_value = formatted_value[: max_length - 3] + "..." # Style formatting padded_message = f"{message:<{LOG_PADDING_WIDTH}}" padded_type = f"{type_name:<12}" # Compose final log message formatted_message = f"{padded_message} {padded_type} {formatted_value}".rstrip() final_message = decorate_log_message(formatted_message, level) if LOGGING and not silent: # Dispatch to appropriate logging level logger.log(level, final_message, stacklevel=2)