Skip to content

Commit

Permalink
refactor(cli): use wrapper decorator instead of spreading return values
Browse files Browse the repository at this point in the history
  • Loading branch information
loqusion committed May 6, 2024
1 parent a4f9d0a commit bedcccd
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 27 deletions.
13 changes: 6 additions & 7 deletions src/hyprshade/cli/on.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

import click

from .utils import MergedVarOption, ShaderParamType, option_variables
from .utils import (
MergedVarOption,
ShaderParamType,
variables_option,
)

if TYPE_CHECKING:
from hyprshade.shader.core import Shader


@click.command(short_help="Turn on screen shader")
@click.argument("shader", type=ShaderParamType())
@click.option(
"--var",
"-V",
"variables",
**option_variables(),
)
@variables_option()
def on(shader: Shader, variables: MergedVarOption):
"""Turn on screen shader."""

Expand Down
9 changes: 2 additions & 7 deletions src/hyprshade/cli/toggle.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
ContextObject,
MergedVarOption,
ShaderParamType,
option_variables,
optional_param,
variables_option,
)


Expand Down Expand Up @@ -43,12 +43,7 @@
default=False,
help="Automatically infer fallback",
)
@click.option(
"--var",
"-V",
"variables",
**option_variables(),
)
@variables_option()
@click.pass_obj
def toggle(
obj: ContextObject,
Expand Down
31 changes: 18 additions & 13 deletions src/hyprshade/cli/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
)

import click
from click.decorators import FC
from more_itertools import unique_justseen

from hyprshade.config.core import Config
Expand Down Expand Up @@ -132,28 +133,32 @@ def convert(
return VarOptionPair(key, value_)


def option_variables(
metavar: str | None = "KEY=VALUE",
*,
callback: Callable | None = None,
) -> dict[str, Any]:
def variables_option(
*param_decls: str, cls: type[click.Option] | None = None, **attrs: Any
) -> Callable[[FC], FC]:
def __to_dict_callback(
ctx: click.Context,
param: click.Parameter,
value: tuple[VarOptionPair, ...],
) -> MergedVarOption:
merged = VarOptionPair.merge(value)
if callback is not None: # pragma: no cover
if (callback := attrs.get("callback")) is not None: # pragma: no cover
return callback(ctx, param, merged)
return merged

return {
"type": VarParamType(),
"multiple": True,
"callback": __to_dict_callback,
"help": "Variables to pass to the shader. May be specified multiple times.",
"metavar": metavar,
}
if len(param_decls) == 0:
param_decls = ("--var", "-V", "variables")

return click.option(
*param_decls,
cls=cls,
metavar="KEY=VALUE",
help="Variables to pass to the shader. May be specified multiple times.",
**attrs,
type=VarParamType(),
multiple=True,
callback=__to_dict_callback,
)


class ContextObject:
Expand Down

0 comments on commit bedcccd

Please sign in to comment.