1#!/usr/bin/env python3
2"""
3
4"""
5# Imports:
6from __future__ import annotations
7
8# ##-- stdlib imports
9import datetime
10import enum
11import functools as ftz
12import itertools as itz
13import logging as logmod
14import pathlib as pl
15import re
16import time
17import types
18import collections
19import contextlib
20import hashlib
21from copy import deepcopy
22from uuid import UUID, uuid1
23from weakref import ref
24import atexit # for @atexit.register
25import faulthandler
26import _string
27# ##-- end stdlib imports
28
29from .. import _interface as API # noqa: N812
30
31# ##-- types
32# isort: off
33import abc
34import collections.abc
35from typing import TYPE_CHECKING, Generic, cast, assert_type, assert_never
36# Protocols:
37from typing import Protocol, runtime_checkable
38# Typing Decorators:
39from typing import no_type_check, final, override, overload
40
41if TYPE_CHECKING:
42 from typing import Final
43 from typing import ClassVar, Any, LiteralString
44 from typing import Never, Self, Literal
45 from typing import TypeGuard
46 from collections.abc import Iterable, Iterator, Callable, Generator
47 from collections.abc import Sequence, Mapping, MutableMapping, Hashable
48
49 from jgdv import Maybe, Ident
50# isort: on
51# ##-- end types
52
53##-- logging
54logging = logmod.getLogger(__name__)
55##-- end logging
56
57# Vars:
58OBRACE : Final[str] = "{"
59CBRACE : Final[str] = "}"
60# Body:
61
[docs]
62class DKeyParser:
63 """ Parser for extracting {}-format params from strings.
64
65 ::
66
67 see: https://peps.python.org/pep-3101/
68 and: https://docs.python.org/3/library/string.html#format-string-syntax
69 """
70
[docs]
71 def parse(self, format_string:str, *, implicit:bool=False) -> Generator[API.RawKey_d]:
72 if implicit and OBRACE in format_string:
73 msg = "Implicit key already has braces"
74 raise ValueError(msg, format_string)
75
76 if implicit: # Wrap implicit keys with braces, to extract format and conv parameters
77 format_string = "".join([OBRACE, format_string, CBRACE]) # noqa: FLY002
78
79 try:
80 for x in _string.formatter_parser(format_string):
81 yield self.make_param(*x)
82 except ValueError:
83 yield self.make_param(format_string)
84
[docs]
85 def make_param(self, prefix:str, key:Maybe[str]=None, format:Maybe[str]=None, convert:Maybe[str]=None) -> API.RawKey_d: # noqa: A002
86 return API.RawKey_d(prefix=prefix, key=key, format=format, convert=convert)