|
1 | 1 | from collections.abc import Callable
|
2 | 2 | from email.message import Message
|
3 | 3 | from email.policy import Policy
|
4 |
| -from typing import Generic, TypeVar, overload |
| 4 | +from typing import Generic, Protocol, TypeVar, overload |
5 | 5 |
|
6 | 6 | __all__ = ["FeedParser", "BytesFeedParser"]
|
7 | 7 |
|
8 | 8 | _MessageT = TypeVar("_MessageT", bound=Message)
|
| 9 | +_T_contra = TypeVar("_T_contra", contravariant=True) |
9 | 10 |
|
10 |
| -class FeedParser(Generic[_MessageT]): |
| 11 | +class _SupportsFeed(Protocol[_T_contra]): |
| 12 | + def feed(self, data: _T_contra) -> None: ... |
| 13 | + |
| 14 | +class FeedParser(Generic[_MessageT], _SupportsFeed[str]): |
11 | 15 | @overload
|
12 | 16 | def __init__(self: FeedParser[Message], _factory: None = None, *, policy: Policy = ...) -> None: ...
|
13 | 17 | @overload
|
14 | 18 | def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
|
15 |
| - def feed(self, data: str) -> None: ... |
16 | 19 | def close(self) -> _MessageT: ...
|
17 | 20 |
|
18 |
| -class BytesFeedParser(Generic[_MessageT]): |
| 21 | +class BytesFeedParser(FeedParser[_MessageT], _SupportsFeed[bytes | bytearray]): |
19 | 22 | @overload
|
20 | 23 | def __init__(self: BytesFeedParser[Message], _factory: None = None, *, policy: Policy = ...) -> None: ...
|
21 | 24 | @overload
|
22 | 25 | def __init__(self, _factory: Callable[[], _MessageT], *, policy: Policy = ...) -> None: ...
|
23 |
| - def feed(self, data: bytes | bytearray) -> None: ... |
24 |
| - def close(self) -> _MessageT: ... |
|
0 commit comments