import argparse import datetime def get_latest_event_year() -> int: now = datetime.datetime.now() year = now.year if now.month < 12: year -= 1 return year def argument_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="aoc") subcli = parser.add_subparsers(title="command", required=True, dest="command") solve = subcli.add_parser("solve", help="solve a given day's puzzle") solve.add_argument( "-e", "--example", action="store_true", required=False, help="use example input file instead of real input file", ) solve.add_argument( "-y", "--year", type=int, required=False, help="year of the puzzle (default: current year)", default=get_latest_event_year(), ) solve.add_argument("day", type=int, help="day of the puzzle (1-25)") create = subcli.add_parser( "create", help="create template and input files for a given day's puzzle" ) create.add_argument( "-y", "--year", type=int, required=False, help="year of the puzzle (default: current year)", default=get_latest_event_year(), ) create.add_argument("day", type=int, help="day of the puzzle (1-25)") download = subcli.add_parser( "download", help="download input file for a given day's puzzle" ) download.add_argument( "-f", "--force", action="store_true", required=False, help="force re-download even if input file already exists", ) download.add_argument( "-y", "--year", type=int, required=False, help="year of the puzzle (default: current year)", default=get_latest_event_year(), ) download.add_argument("day", type=int, help="day of the puzzle (1-25)") return parser