187 lines
4.5 KiB
Python
187 lines
4.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from .config import Config
|
|
|
|
|
|
class DuplicateArgumentError(Exception):
|
|
def __init__(self, key: str) -> None:
|
|
self.message = f"Duplicate argument: {key}"
|
|
|
|
def __str__(self) -> str:
|
|
return self.message
|
|
|
|
|
|
class MissingInfoError(Exception):
|
|
def __init__(self, key: str) -> None:
|
|
self.message = f"Missing info for argument: {key}"
|
|
|
|
def __str__(self) -> str:
|
|
return self.message
|
|
|
|
|
|
class DuplicateInfoError(Exception):
|
|
def __init__(self, key: str) -> None:
|
|
self.message = f"Duplicate info for argument: {key}"
|
|
|
|
def __str__(self) -> str:
|
|
return self.message
|
|
|
|
|
|
class ArgSpec:
|
|
vinfo: str
|
|
defaults: dict[str, Any]
|
|
arguments: dict[str, Any]
|
|
infos: list[str]
|
|
|
|
@staticmethod
|
|
def prepare() -> None:
|
|
ArgSpec.vinfo = f"{Config.title} {Config.version}"
|
|
ArgSpec.defaults = {}
|
|
ArgSpec.arguments = {}
|
|
ArgSpec.infos = []
|
|
ArgSpec.add_arguments()
|
|
|
|
@staticmethod
|
|
def add_argument(key: str, info: str, **kwargs: Any) -> None:
|
|
if key in ArgSpec.arguments:
|
|
raise DuplicateArgumentError(key)
|
|
|
|
if not info:
|
|
raise MissingInfoError(key)
|
|
|
|
if info in ArgSpec.infos:
|
|
raise DuplicateInfoError(key)
|
|
|
|
ArgSpec.arguments[key] = {
|
|
"help": info,
|
|
**kwargs,
|
|
}
|
|
|
|
ArgSpec.infos.append(info)
|
|
|
|
@staticmethod
|
|
def add_arguments() -> None:
|
|
ArgSpec.add_argument(
|
|
"version",
|
|
action="version",
|
|
info="Check the version of the program",
|
|
version=ArgSpec.vinfo,
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"names",
|
|
type=str,
|
|
info="Path to a JSON file with a list of names. Use these instead of the default ones",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"ants",
|
|
type=str,
|
|
info="Path to a JSON file with ants data. Use this instead of the default one",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"no_images",
|
|
action="store_false",
|
|
info="Don't show the images on the left",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"no_header",
|
|
action="store_false",
|
|
info="Don't show the header controls",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"no_footer",
|
|
action="store_false",
|
|
info="Don't show the footer controls",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"no_intro",
|
|
action="store_false",
|
|
info="Don't show the intro message",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"title",
|
|
type=str,
|
|
info="Custom title for the window",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"width",
|
|
type=int,
|
|
info="The width of the window in pixels",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"height",
|
|
type=int,
|
|
info="The height of the window in pixels",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"program",
|
|
type=str,
|
|
info="The internal name of the program",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"speed",
|
|
type=str,
|
|
choices=["fast", "normal", "slow", "paused"],
|
|
info="Use this update speed",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"clean",
|
|
action="store_true",
|
|
info="Start with clean ants data",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"fast_seconds",
|
|
type=int,
|
|
info="The number of seconds between fast updates",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"normal_minutes",
|
|
type=float,
|
|
info="The number of minutes between normal updates",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"slow_minutes",
|
|
type=float,
|
|
info="The number of minutes between slow updates",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"argdoc",
|
|
action="store_true",
|
|
info="Make the arguments document and exit",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"score",
|
|
action="store_true",
|
|
info="Show the score on triumph or hits instead of the total of each",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"mono",
|
|
action="store_true",
|
|
info="Use a monospace font",
|
|
)
|
|
|
|
ArgSpec.add_argument(
|
|
"no_fade",
|
|
action="store_false",
|
|
info="Don't apply a fade-in effect on new updates",
|
|
)
|