aboutsummaryrefslogtreecommitdiff
path: root/pyhon/printer.py
blob: 9c84815d620921278bfef0a47e577f990f275b60 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from typing import Dict, Any, TYPE_CHECKING, List

from pyhon.parameter.enum import HonParameterEnum
from pyhon.parameter.range import HonParameterRange

if TYPE_CHECKING:
    from pyhon.commands import HonCommand


def key_print(data: Any, key: str = "", start: bool = True) -> str:
    result = ""
    if isinstance(data, list):
        for i, value in enumerate(data):
            result += key_print(value, key=f"{key}.{i}", start=False)
    elif isinstance(data, dict):
        for k, value in sorted(data.items()):
            result += key_print(value, key=k if start else f"{key}.{k}", start=False)
    else:
        result += f"{key}: {data}\n"
    return result


# yaml.dump() would be done the same, but needs an additional dependency...
def pretty_print(
    data: Any,
    key: str = "",
    intend: int = 0,
    is_list: bool = False,
    whitespace: str = "  ",
) -> str:
    result = ""
    space = whitespace * intend
    if isinstance(data, (dict, list)) and key:
        result += f"{space}{'- ' if is_list else ''}{key}:\n"
        intend += 1
    if isinstance(data, list):
        for i, value in enumerate(data):
            result += pretty_print(
                value, intend=intend, is_list=True, whitespace=whitespace
            )
    elif isinstance(data, dict):
        for i, (list_key, value) in enumerate(sorted(data.items())):
            result += pretty_print(
                value,
                key=list_key,
                intend=intend + (is_list if i else 0),
                is_list=is_list and not i,
                whitespace=whitespace,
            )
    else:
        result += f"{space}{'- ' if is_list else ''}{key}{': ' if key else ''}{data}\n"
    return result


def create_commands(
    commands: Dict[str, "HonCommand"], concat: bool = False
) -> Dict[str, Any]:
    result: Dict[str, Any] = {}
    for name, command in commands.items():
        for parameter, data in command.available_settings.items():
            if isinstance(data, HonParameterEnum):
                value: List[str] | Dict[str, str | float] = data.values
            elif isinstance(data, HonParameterRange):
                value = {"min": data.min, "max": data.max, "step": data.step}
            else:
                continue
            if not concat:
                result.setdefault(name, {})[parameter] = value
            else:
                result[f"{name}.{parameter}"] = value
    return result


def create_rules(
    commands: Dict[str, "HonCommand"], concat: bool = False
) -> Dict[str, Any]:
    result: Dict[str, Any] = {}
    for name, command in commands.items():
        for parameter, data in command.available_settings.items():
            value = data.triggers
            if not value:
                continue
            if not concat:
                result.setdefault(name, {})[parameter] = value
            else:
                result[f"{name}.{parameter}"] = value
    return result