Current state
This commit is contained in:
@@ -0,0 +1,80 @@
|
|||||||
|
#!/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()
|
||||||
Reference in New Issue
Block a user