dnd-rolltable/rolltable/cli.py

75 lines
1.9 KiB
Python
Raw Normal View History

from rolltable.types import RollTable
from rolltable import tables
2022-07-30 14:20:26 -07:00
import typer
from enum import Enum
2022-07-30 14:20:26 -07:00
from rich import print
2022-07-31 15:03:19 -07:00
from pathlib import Path
from typing import List
2022-07-30 14:20:26 -07:00
app = typer.Typer()
class OUTPUT_FORMATS(Enum):
text = 'text'
yaml = 'yaml'
markdown = 'markdown'
@app.command("custom")
def custom(
2022-07-31 15:03:19 -07:00
sources: List[Path] = typer.Argument(
2022-07-30 14:20:26 -07:00
...,
2022-07-31 15:03:19 -07:00
help="Path to one or more yaml-formatted source file."),
2022-07-30 14:20:26 -07:00
frequency: str = typer.Option(
'default',
help='use the specified frequency from the source file'),
die: int = typer.Option(
20,
help='The size of the die for which to create a table'),
hide_rolls: bool = typer.Option(
False,
help='If True, do not show the Roll column.',
),
2022-07-31 15:03:19 -07:00
collapsed: bool = typer.Option(
2022-07-30 14:20:26 -07:00
True,
2022-08-06 17:33:54 -07:00
help='If True, collapse multiple die values with the same option.'),
width: int = typer.Option(
120,
help='Width of the table.'),
output: OUTPUT_FORMATS = typer.Option(
'text',
help='The output format to use.',
)
2022-07-30 14:20:26 -07:00
):
"""
Create roll tables from custom sources.
2022-07-30 14:20:26 -07:00
"""
2022-07-31 15:03:19 -07:00
rt = RollTable([Path(s).read_text() for s in sources], frequency=frequency, die=die, hide_rolls=hide_rolls)
2022-07-31 15:03:19 -07:00
if output == OUTPUT_FORMATS.yaml:
2022-08-06 21:19:59 -07:00
print(rt.as_yaml())
elif output == OUTPUT_FORMATS.markdown:
print(rt.as_markdown())
else:
print(rt.as_table(width=width, expanded=not collapsed))
2022-07-30 14:20:26 -07:00
def make_callback(roll_table_instance):
def inner():
print(roll_table_instance.as_table())
return inner
# step through all the predfined tables and create a cli for each
for name, table in tables.index.items():
help_text = name.replace('_', ' ').title()
app.command(name=name, help=f"Create a roll table of {help_text}")(
make_callback(table)
)
2022-07-30 14:20:26 -07:00
if __name__ == '__main__':
app()