#!/usr/bin/env python from dataclasses import dataclass, field from typing import ClassVar @dataclass class Counter(): top: int value: int @dataclass class Minter(): legalstring: ClassVar[str] = "0123456789bcdfghjkmnpqrstvwxz" alphacount: ClassVar[int] = len(legalstring) digitcount: ClassVar[int] = 10 oacounter: int = 0 template: str = "" total: int = 0 prefix: str = "" mask: str = "" active_counters: list[Counter] = field(default_factory=list) inactive_counters: list[Counter] = field(default_factory=list) def parse_template(self, template: str) -> int: """ >>> m = Minter() >>> m.parse_template("test") -1 >>> m.template 'test' >>> m.prefix '' >>> m.mask 'test' >>> m.parse_template("testkktest") -1 >>> m.parse_template("rtesk") -1 >>> m.parse_template("rteksk") -1 >>> m.parse_template("rtkkes") -1 >>> m.parse_template("reded") 84100 >>> m.parse_template("ed") -1 >>> m.parse_template("red") 290 >>> m.parse_template("redk") 290 """ self.template = template template = template.strip().removesuffix('/').strip() try: self.prefix, *_, self.mask = template.split(".") except ValueError: self.prefix = "" self.mask = template if self.mask[0] not in ("r", "s", "z"): return -1 # mask must begin with of the letters: r, s or z if "k" in self.mask and (self.mask.count("k") > 1 or self.mask[-1] != "k"): return -1 if not all(char in ("d", "e") for char in self.mask.rstrip("k")[1:]): return -1 self.total = 1 for chr in self.mask: match chr: case "e": self.total *= self.alphacount case "d": self.total *= self.digitcount return self.total if __name__ == "__main__": import doctest doctest.testmod()