telegrinder 0.3.3.post1__py3-none-any.whl → 0.3.4.post1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of telegrinder might be problematic. Click here for more details.

Files changed (165) hide show
  1. telegrinder/__init__.py +144 -144
  2. telegrinder/api/__init__.py +8 -8
  3. telegrinder/api/api.py +93 -93
  4. telegrinder/api/error.py +16 -16
  5. telegrinder/api/response.py +20 -20
  6. telegrinder/api/token.py +36 -36
  7. telegrinder/bot/__init__.py +66 -66
  8. telegrinder/bot/bot.py +76 -76
  9. telegrinder/bot/cute_types/__init__.py +17 -17
  10. telegrinder/bot/cute_types/base.py +258 -258
  11. telegrinder/bot/cute_types/callback_query.py +385 -385
  12. telegrinder/bot/cute_types/chat_join_request.py +61 -61
  13. telegrinder/bot/cute_types/chat_member_updated.py +160 -160
  14. telegrinder/bot/cute_types/inline_query.py +43 -43
  15. telegrinder/bot/cute_types/message.py +2637 -2637
  16. telegrinder/bot/cute_types/update.py +104 -109
  17. telegrinder/bot/cute_types/utils.py +95 -95
  18. telegrinder/bot/dispatch/__init__.py +55 -55
  19. telegrinder/bot/dispatch/abc.py +77 -77
  20. telegrinder/bot/dispatch/context.py +98 -98
  21. telegrinder/bot/dispatch/dispatch.py +202 -202
  22. telegrinder/bot/dispatch/handler/__init__.py +13 -13
  23. telegrinder/bot/dispatch/handler/abc.py +24 -24
  24. telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
  25. telegrinder/bot/dispatch/handler/base.py +57 -57
  26. telegrinder/bot/dispatch/handler/document_reply.py +44 -44
  27. telegrinder/bot/dispatch/handler/func.py +135 -135
  28. telegrinder/bot/dispatch/handler/media_group_reply.py +43 -43
  29. telegrinder/bot/dispatch/handler/message_reply.py +36 -36
  30. telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
  31. telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
  32. telegrinder/bot/dispatch/handler/video_reply.py +44 -44
  33. telegrinder/bot/dispatch/middleware/__init__.py +3 -3
  34. telegrinder/bot/dispatch/middleware/abc.py +22 -16
  35. telegrinder/bot/dispatch/process.py +157 -132
  36. telegrinder/bot/dispatch/return_manager/__init__.py +13 -13
  37. telegrinder/bot/dispatch/return_manager/abc.py +108 -108
  38. telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
  39. telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
  40. telegrinder/bot/dispatch/return_manager/message.py +36 -36
  41. telegrinder/bot/dispatch/view/__init__.py +13 -13
  42. telegrinder/bot/dispatch/view/abc.py +41 -41
  43. telegrinder/bot/dispatch/view/base.py +200 -200
  44. telegrinder/bot/dispatch/view/box.py +129 -129
  45. telegrinder/bot/dispatch/view/callback_query.py +17 -17
  46. telegrinder/bot/dispatch/view/chat_join_request.py +16 -16
  47. telegrinder/bot/dispatch/view/chat_member.py +39 -39
  48. telegrinder/bot/dispatch/view/inline_query.py +17 -17
  49. telegrinder/bot/dispatch/view/message.py +44 -44
  50. telegrinder/bot/dispatch/view/raw.py +114 -114
  51. telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
  52. telegrinder/bot/dispatch/waiter_machine/actions.py +13 -13
  53. telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
  54. telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
  55. telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +57 -57
  56. telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
  57. telegrinder/bot/dispatch/waiter_machine/hasher/state.py +19 -19
  58. telegrinder/bot/dispatch/waiter_machine/machine.py +172 -167
  59. telegrinder/bot/dispatch/waiter_machine/middleware.py +89 -89
  60. telegrinder/bot/dispatch/waiter_machine/short_state.py +68 -68
  61. telegrinder/bot/polling/__init__.py +4 -4
  62. telegrinder/bot/polling/abc.py +25 -25
  63. telegrinder/bot/polling/polling.py +131 -131
  64. telegrinder/bot/rules/__init__.py +62 -62
  65. telegrinder/bot/rules/abc.py +213 -213
  66. telegrinder/bot/rules/adapter/__init__.py +12 -9
  67. telegrinder/bot/rules/adapter/abc.py +31 -29
  68. telegrinder/bot/rules/adapter/errors.py +5 -5
  69. telegrinder/bot/rules/adapter/event.py +65 -67
  70. telegrinder/bot/rules/adapter/node.py +48 -48
  71. telegrinder/bot/rules/adapter/raw_event.py +27 -0
  72. telegrinder/bot/rules/adapter/raw_update.py +30 -30
  73. telegrinder/bot/rules/callback_data.py +170 -170
  74. telegrinder/bot/rules/chat_join.py +46 -46
  75. telegrinder/bot/rules/command.py +126 -126
  76. telegrinder/bot/rules/enum_text.py +36 -36
  77. telegrinder/bot/rules/func.py +26 -26
  78. telegrinder/bot/rules/fuzzy.py +24 -24
  79. telegrinder/bot/rules/inline.py +60 -60
  80. telegrinder/bot/rules/integer.py +20 -20
  81. telegrinder/bot/rules/is_from.py +127 -127
  82. telegrinder/bot/rules/markup.py +43 -43
  83. telegrinder/bot/rules/mention.py +14 -14
  84. telegrinder/bot/rules/message.py +17 -17
  85. telegrinder/bot/rules/message_entities.py +35 -35
  86. telegrinder/bot/rules/node.py +27 -27
  87. telegrinder/bot/rules/regex.py +37 -37
  88. telegrinder/bot/rules/rule_enum.py +72 -72
  89. telegrinder/bot/rules/start.py +42 -42
  90. telegrinder/bot/rules/state.py +37 -37
  91. telegrinder/bot/rules/text.py +33 -33
  92. telegrinder/bot/rules/update.py +15 -15
  93. telegrinder/bot/scenario/__init__.py +5 -5
  94. telegrinder/bot/scenario/abc.py +19 -19
  95. telegrinder/bot/scenario/checkbox.py +176 -167
  96. telegrinder/bot/scenario/choice.py +51 -46
  97. telegrinder/client/__init__.py +4 -4
  98. telegrinder/client/abc.py +75 -75
  99. telegrinder/client/aiohttp.py +130 -130
  100. telegrinder/model.py +320 -295
  101. telegrinder/modules.py +237 -237
  102. telegrinder/msgspec_json.py +14 -14
  103. telegrinder/msgspec_utils.py +410 -410
  104. telegrinder/node/__init__.py +0 -0
  105. telegrinder/node/attachment.py +87 -87
  106. telegrinder/node/base.py +166 -166
  107. telegrinder/node/callback_query.py +53 -53
  108. telegrinder/node/command.py +33 -33
  109. telegrinder/node/composer.py +198 -198
  110. telegrinder/node/container.py +27 -27
  111. telegrinder/node/event.py +65 -65
  112. telegrinder/node/me.py +16 -16
  113. telegrinder/node/message.py +14 -14
  114. telegrinder/node/polymorphic.py +48 -48
  115. telegrinder/node/rule.py +76 -76
  116. telegrinder/node/scope.py +38 -38
  117. telegrinder/node/source.py +71 -71
  118. telegrinder/node/text.py +41 -41
  119. telegrinder/node/tools/__init__.py +3 -3
  120. telegrinder/node/tools/generator.py +40 -40
  121. telegrinder/node/update.py +15 -15
  122. telegrinder/rules.py +0 -0
  123. telegrinder/tools/__init__.py +74 -74
  124. telegrinder/tools/buttons.py +79 -79
  125. telegrinder/tools/error_handler/__init__.py +7 -7
  126. telegrinder/tools/error_handler/abc.py +33 -33
  127. telegrinder/tools/error_handler/error.py +9 -9
  128. telegrinder/tools/error_handler/error_handler.py +193 -193
  129. telegrinder/tools/formatting/__init__.py +46 -46
  130. telegrinder/tools/formatting/html.py +283 -283
  131. telegrinder/tools/formatting/links.py +33 -33
  132. telegrinder/tools/formatting/spec_html_formats.py +111 -111
  133. telegrinder/tools/functional.py +12 -12
  134. telegrinder/tools/global_context/__init__.py +7 -7
  135. telegrinder/tools/global_context/abc.py +63 -63
  136. telegrinder/tools/global_context/global_context.py +412 -412
  137. telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
  138. telegrinder/tools/i18n/__init__.py +7 -7
  139. telegrinder/tools/i18n/abc.py +30 -30
  140. telegrinder/tools/i18n/middleware/__init__.py +3 -3
  141. telegrinder/tools/i18n/middleware/abc.py +25 -25
  142. telegrinder/tools/i18n/simple.py +43 -43
  143. telegrinder/tools/kb_set/__init__.py +4 -4
  144. telegrinder/tools/kb_set/base.py +15 -15
  145. telegrinder/tools/kb_set/yaml.py +63 -63
  146. telegrinder/tools/keyboard.py +132 -132
  147. telegrinder/tools/limited_dict.py +37 -37
  148. telegrinder/tools/loop_wrapper/__init__.py +4 -4
  149. telegrinder/tools/loop_wrapper/abc.py +15 -15
  150. telegrinder/tools/loop_wrapper/loop_wrapper.py +224 -224
  151. telegrinder/tools/magic.py +157 -157
  152. telegrinder/tools/parse_mode.py +6 -6
  153. telegrinder/tools/state_storage/__init__.py +4 -4
  154. telegrinder/tools/state_storage/abc.py +35 -35
  155. telegrinder/tools/state_storage/memory.py +25 -25
  156. telegrinder/types/__init__.py +260 -260
  157. telegrinder/types/enums.py +701 -701
  158. telegrinder/types/methods.py +4633 -4633
  159. telegrinder/types/objects.py +6950 -8561
  160. telegrinder/verification_utils.py +32 -32
  161. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/LICENSE +22 -22
  162. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/METADATA +1 -1
  163. telegrinder-0.3.4.post1.dist-info/RECORD +165 -0
  164. telegrinder-0.3.3.post1.dist-info/RECORD +0 -164
  165. {telegrinder-0.3.3.post1.dist-info → telegrinder-0.3.4.post1.dist-info}/WHEEL +0 -0
@@ -1,193 +1,193 @@
1
- import dataclasses
2
- import typing
3
-
4
- from fntypes.result import Error, Ok, Result
5
-
6
- from telegrinder.api.api import API
7
- from telegrinder.bot.dispatch.context import Context
8
- from telegrinder.modules import logger
9
- from telegrinder.node.base import is_node
10
- from telegrinder.tools.error_handler.abc import ABCErrorHandler, Event, Handler
11
- from telegrinder.tools.error_handler.error import CatcherError
12
- from telegrinder.tools.magic import get_annotations, magic_bundle
13
-
14
- F = typing.TypeVar("F", bound="FuncCatcher[typing.Any]")
15
- ExceptionT = typing.TypeVar("ExceptionT", bound=BaseException, contravariant=True)
16
- FuncCatcher = typing.Callable[typing.Concatenate[ExceptionT, ...], typing.Awaitable[typing.Any]]
17
-
18
-
19
- async def run_handler(
20
- handler: Handler,
21
- event: typing.Any,
22
- ctx: dict[str, typing.Any],
23
- ) -> typing.Any:
24
- annotations = tuple(get_annotations(handler).values())
25
- start_idx = 0 if is_node(None if not annotations else annotations[0]) else 1
26
- context = magic_bundle(handler, ctx, start_idx=start_idx)
27
- return await (handler(event, **context) if start_idx == 1 else handler(**context))
28
-
29
-
30
- @dataclasses.dataclass(frozen=True, repr=False, slots=True)
31
- class Catcher(typing.Generic[Event]):
32
- func: FuncCatcher[BaseException]
33
- exceptions: list[type[BaseException] | BaseException] = dataclasses.field(
34
- default_factory=lambda: [],
35
- kw_only=True,
36
- )
37
- logging: bool = dataclasses.field(default=False, kw_only=True)
38
- raise_exception: bool = dataclasses.field(default=False, kw_only=True)
39
- ignore_errors: bool = dataclasses.field(default=False, kw_only=True)
40
-
41
- def __repr__(self) -> str:
42
- return "<Catcher: function={!r}, logging={}, raise_exception={}, ignore_errors={}>".format(
43
- self.func.__name__,
44
- self.logging,
45
- self.raise_exception,
46
- self.ignore_errors,
47
- )
48
-
49
- async def __call__(
50
- self,
51
- handler: Handler,
52
- event: Event,
53
- api: API,
54
- ctx: Context,
55
- ) -> Result[typing.Any, BaseException]:
56
- try:
57
- return Ok(await run_handler(handler, event, ctx))
58
- except BaseException as exc:
59
- return await self.run(api, event, ctx, exc, handler.__name__)
60
-
61
- def match_exception(self, exception: BaseException) -> bool:
62
- for exc in self.exceptions:
63
- if isinstance(exc, type) and type(exception) is exc:
64
- return True
65
- if isinstance(exc, object) and type(exception) is type(exc):
66
- return True if not exc.args else exc.args == exception.args
67
-
68
- return False
69
-
70
- async def run(
71
- self,
72
- api: API,
73
- event: Event,
74
- ctx: Context,
75
- exception: BaseException,
76
- handler_name: str,
77
- ) -> Result[typing.Any, BaseException]:
78
- if self.match_exception(exception):
79
- logger.debug(
80
- "Error handler caught an exception {!r} in handler {!r}, running catcher {!r}...".format(
81
- exception, handler_name, self.func.__name__
82
- )
83
- )
84
- return Ok(await run_handler(self.func, event, {"event": event, "api": api} | ctx))
85
-
86
- logger.debug("Failed to match exception {!r}.", exception.__class__.__name__)
87
- return Error(exception)
88
-
89
-
90
- class ErrorHandler(ABCErrorHandler[Event]):
91
- def __init__(self, catcher: Catcher[Event] | None = None, /) -> None:
92
- self.catcher = catcher
93
-
94
- def __repr__(self) -> str:
95
- return (
96
- "<{}: exceptions_handled=[{}], catcher={!r}>".format(
97
- self.__class__.__name__,
98
- ", ".join(e.__name__ if isinstance(e, type) else repr(e) for e in self.catcher.exceptions),
99
- self.catcher,
100
- )
101
- if self.catcher is not None
102
- else "<{}()>".format(self.__class__.__name__)
103
- )
104
-
105
- def __call__(
106
- self,
107
- *exceptions: type[BaseException] | BaseException,
108
- logging: bool = False,
109
- raise_exception: bool = False,
110
- ignore_errors: bool = False,
111
- ):
112
- """Register the catcher.
113
-
114
- :param logging: Logging the result of the catcher at the level `DEBUG`.
115
- :param raise_exception: Raise an exception if the catcher has not started.
116
- :param ignore_errors: Ignore errors that may occur.
117
- """
118
-
119
- def decorator(func: F) -> F:
120
- if not self.catcher:
121
- self.catcher = Catcher(
122
- func,
123
- exceptions=list(exceptions),
124
- logging=logging,
125
- raise_exception=raise_exception,
126
- ignore_errors=ignore_errors,
127
- )
128
- return func
129
-
130
- return decorator
131
-
132
- def _process_catcher_error(self, error: CatcherError) -> Result[None, BaseException]:
133
- assert self.catcher is not None
134
-
135
- if self.catcher.raise_exception:
136
- raise error.exc from None
137
- if self.catcher.logging:
138
- logger.error(error.message)
139
- if not self.catcher.ignore_errors:
140
- return Error(error.exc)
141
-
142
- return Ok(None)
143
-
144
- async def process(
145
- self,
146
- handler: Handler,
147
- event: Event,
148
- api: API,
149
- ctx: Context,
150
- ) -> Result[typing.Any, BaseException]:
151
- assert self.catcher is not None
152
- logger.debug("Processing the error handler for handler {!r}...", handler.__name__)
153
-
154
- try:
155
- return await self.catcher(handler, event, api, ctx)
156
- except BaseException as exc:
157
- return Error(
158
- CatcherError(
159
- exc,
160
- "Exception {} was occurred during the running catcher {!r}.".format(
161
- repr(exc), self.catcher.func.__name__
162
- ),
163
- )
164
- )
165
-
166
- async def run(
167
- self,
168
- handler: Handler,
169
- event: Event,
170
- api: API,
171
- ctx: Context,
172
- ) -> Result[typing.Any, BaseException]:
173
- if not self.catcher:
174
- return Ok(await run_handler(handler, event, ctx))
175
-
176
- match await self.process(handler, event, api, ctx):
177
- case Ok(value) as ok:
178
- if self.catcher.logging:
179
- logger.debug(
180
- "Catcher {!r} returned: {!r}",
181
- self.catcher.func.__name__,
182
- value,
183
- )
184
- return ok
185
- case Error(exc) as err:
186
- if isinstance(exc, CatcherError):
187
- return self._process_catcher_error(exc)
188
- if self.catcher.ignore_errors:
189
- return Ok(None)
190
- return err
191
-
192
-
193
- __all__ = ("Catcher", "ErrorHandler")
1
+ import dataclasses
2
+ import typing
3
+
4
+ from fntypes.result import Error, Ok, Result
5
+
6
+ from telegrinder.api.api import API
7
+ from telegrinder.bot.dispatch.context import Context
8
+ from telegrinder.modules import logger
9
+ from telegrinder.node.base import is_node
10
+ from telegrinder.tools.error_handler.abc import ABCErrorHandler, Event, Handler
11
+ from telegrinder.tools.error_handler.error import CatcherError
12
+ from telegrinder.tools.magic import get_annotations, magic_bundle
13
+
14
+ F = typing.TypeVar("F", bound="FuncCatcher[typing.Any]")
15
+ ExceptionT = typing.TypeVar("ExceptionT", bound=BaseException, contravariant=True)
16
+ FuncCatcher = typing.Callable[typing.Concatenate[ExceptionT, ...], typing.Awaitable[typing.Any]]
17
+
18
+
19
+ async def run_handler(
20
+ handler: Handler,
21
+ event: typing.Any,
22
+ ctx: dict[str, typing.Any],
23
+ ) -> typing.Any:
24
+ annotations = tuple(get_annotations(handler).values())
25
+ start_idx = 0 if is_node(None if not annotations else annotations[0]) else 1
26
+ context = magic_bundle(handler, ctx, start_idx=start_idx)
27
+ return await (handler(event, **context) if start_idx == 1 else handler(**context))
28
+
29
+
30
+ @dataclasses.dataclass(frozen=True, repr=False, slots=True)
31
+ class Catcher(typing.Generic[Event]):
32
+ func: FuncCatcher[BaseException]
33
+ exceptions: list[type[BaseException] | BaseException] = dataclasses.field(
34
+ default_factory=lambda: [],
35
+ kw_only=True,
36
+ )
37
+ logging: bool = dataclasses.field(default=False, kw_only=True)
38
+ raise_exception: bool = dataclasses.field(default=False, kw_only=True)
39
+ ignore_errors: bool = dataclasses.field(default=False, kw_only=True)
40
+
41
+ def __repr__(self) -> str:
42
+ return "<Catcher: function={!r}, logging={}, raise_exception={}, ignore_errors={}>".format(
43
+ self.func.__name__,
44
+ self.logging,
45
+ self.raise_exception,
46
+ self.ignore_errors,
47
+ )
48
+
49
+ async def __call__(
50
+ self,
51
+ handler: Handler,
52
+ event: Event,
53
+ api: API,
54
+ ctx: Context,
55
+ ) -> Result[typing.Any, BaseException]:
56
+ try:
57
+ return Ok(await run_handler(handler, event, ctx))
58
+ except BaseException as exc:
59
+ return await self.run(api, event, ctx, exc, handler.__name__)
60
+
61
+ def match_exception(self, exception: BaseException) -> bool:
62
+ for exc in self.exceptions:
63
+ if isinstance(exc, type) and type(exception) is exc:
64
+ return True
65
+ if isinstance(exc, object) and type(exception) is type(exc):
66
+ return True if not exc.args else exc.args == exception.args
67
+
68
+ return False
69
+
70
+ async def run(
71
+ self,
72
+ api: API,
73
+ event: Event,
74
+ ctx: Context,
75
+ exception: BaseException,
76
+ handler_name: str,
77
+ ) -> Result[typing.Any, BaseException]:
78
+ if self.match_exception(exception):
79
+ logger.debug(
80
+ "Error handler caught an exception {!r} in handler {!r}, running catcher {!r}...".format(
81
+ exception, handler_name, self.func.__name__
82
+ )
83
+ )
84
+ return Ok(await run_handler(self.func, event, {"event": event, "api": api} | ctx))
85
+
86
+ logger.debug("Failed to match exception {!r}.", exception.__class__.__name__)
87
+ return Error(exception)
88
+
89
+
90
+ class ErrorHandler(ABCErrorHandler[Event]):
91
+ def __init__(self, catcher: Catcher[Event] | None = None, /) -> None:
92
+ self.catcher = catcher
93
+
94
+ def __repr__(self) -> str:
95
+ return (
96
+ "<{}: exceptions_handled=[{}], catcher={!r}>".format(
97
+ self.__class__.__name__,
98
+ ", ".join(e.__name__ if isinstance(e, type) else repr(e) for e in self.catcher.exceptions),
99
+ self.catcher,
100
+ )
101
+ if self.catcher is not None
102
+ else "<{}()>".format(self.__class__.__name__)
103
+ )
104
+
105
+ def __call__(
106
+ self,
107
+ *exceptions: type[BaseException] | BaseException,
108
+ logging: bool = False,
109
+ raise_exception: bool = False,
110
+ ignore_errors: bool = False,
111
+ ):
112
+ """Register the catcher.
113
+
114
+ :param logging: Logging the result of the catcher at the level `DEBUG`.
115
+ :param raise_exception: Raise an exception if the catcher has not started.
116
+ :param ignore_errors: Ignore errors that may occur.
117
+ """
118
+
119
+ def decorator(func: F) -> F:
120
+ if not self.catcher:
121
+ self.catcher = Catcher(
122
+ func,
123
+ exceptions=list(exceptions),
124
+ logging=logging,
125
+ raise_exception=raise_exception,
126
+ ignore_errors=ignore_errors,
127
+ )
128
+ return func
129
+
130
+ return decorator
131
+
132
+ def _process_catcher_error(self, error: CatcherError) -> Result[None, BaseException]:
133
+ assert self.catcher is not None
134
+
135
+ if self.catcher.raise_exception:
136
+ raise error.exc from None
137
+ if self.catcher.logging:
138
+ logger.error(error.message)
139
+ if not self.catcher.ignore_errors:
140
+ return Error(error.exc)
141
+
142
+ return Ok(None)
143
+
144
+ async def process(
145
+ self,
146
+ handler: Handler,
147
+ event: Event,
148
+ api: API,
149
+ ctx: Context,
150
+ ) -> Result[typing.Any, BaseException]:
151
+ assert self.catcher is not None
152
+ logger.debug("Processing the error handler for handler {!r}...", handler.__name__)
153
+
154
+ try:
155
+ return await self.catcher(handler, event, api, ctx)
156
+ except BaseException as exc:
157
+ return Error(
158
+ CatcherError(
159
+ exc,
160
+ "Exception {} was occurred during the running catcher {!r}.".format(
161
+ repr(exc), self.catcher.func.__name__
162
+ ),
163
+ )
164
+ )
165
+
166
+ async def run(
167
+ self,
168
+ handler: Handler,
169
+ event: Event,
170
+ api: API,
171
+ ctx: Context,
172
+ ) -> Result[typing.Any, BaseException]:
173
+ if not self.catcher:
174
+ return Ok(await run_handler(handler, event, ctx))
175
+
176
+ match await self.process(handler, event, api, ctx):
177
+ case Ok(value) as ok:
178
+ if self.catcher.logging:
179
+ logger.debug(
180
+ "Catcher {!r} returned: {!r}",
181
+ self.catcher.func.__name__,
182
+ value,
183
+ )
184
+ return ok
185
+ case Error(exc) as err:
186
+ if isinstance(exc, CatcherError):
187
+ return self._process_catcher_error(exc)
188
+ if self.catcher.ignore_errors:
189
+ return Ok(None)
190
+ return err
191
+
192
+
193
+ __all__ = ("Catcher", "ErrorHandler")
@@ -1,47 +1,47 @@
1
- from .html import (
2
- FormatString,
3
- HTMLFormatter,
4
- block_quote,
5
- bold,
6
- channel_boost_link,
7
- code_inline,
8
- escape,
9
- invite_chat_link,
10
- italic,
11
- link,
12
- mention,
13
- pre_code,
14
- resolve_domain,
15
- spoiler,
16
- start_bot_link,
17
- start_group_link,
18
- strike,
19
- tg_emoji,
20
- underline,
21
- )
22
- from .links import (
23
- get_channel_boost_link,
24
- get_invite_chat_link,
25
- get_mention_link,
26
- get_resolve_domain_link,
27
- get_start_bot_link,
28
- get_start_group_link,
29
- )
30
- from .spec_html_formats import (
31
- BaseSpecFormat,
32
- ChannelBoostLink,
33
- InviteChatLink,
34
- Link,
35
- Mention,
36
- PreCode,
37
- ResolveDomain,
38
- SpecialFormat,
39
- StartBotLink,
40
- StartGroupLink,
41
- TgEmoji,
42
- )
43
-
44
- __all__ = (
1
+ from .html import (
2
+ FormatString,
3
+ HTMLFormatter,
4
+ block_quote,
5
+ bold,
6
+ channel_boost_link,
7
+ code_inline,
8
+ escape,
9
+ invite_chat_link,
10
+ italic,
11
+ link,
12
+ mention,
13
+ pre_code,
14
+ resolve_domain,
15
+ spoiler,
16
+ start_bot_link,
17
+ start_group_link,
18
+ strike,
19
+ tg_emoji,
20
+ underline,
21
+ )
22
+ from .links import (
23
+ get_channel_boost_link,
24
+ get_invite_chat_link,
25
+ get_mention_link,
26
+ get_resolve_domain_link,
27
+ get_start_bot_link,
28
+ get_start_group_link,
29
+ )
30
+ from .spec_html_formats import (
31
+ BaseSpecFormat,
32
+ ChannelBoostLink,
33
+ InviteChatLink,
34
+ Link,
35
+ Mention,
36
+ PreCode,
37
+ ResolveDomain,
38
+ SpecialFormat,
39
+ StartBotLink,
40
+ StartGroupLink,
41
+ TgEmoji,
42
+ )
43
+
44
+ __all__ = (
45
45
  "BaseSpecFormat",
46
46
  "ChannelBoostLink",
47
47
  "FormatString",
@@ -77,5 +77,5 @@ __all__ = (
77
77
  "start_group_link",
78
78
  "strike",
79
79
  "tg_emoji",
80
- "underline",
81
- )
80
+ "underline",
81
+ )