from collections.abc import Callable
from typing import Any, TypeAlias, overload

from django.utils.functional import _StrOrPromise
from typing_extensions import Self, TypeVar, override

_SD = TypeVar("_SD", bound=SafeData)

class SafeData:
    def __html__(self) -> Self: ...

class SafeString(str, SafeData):
    @overload
    @override
    def __add__(self, rhs: SafeString) -> SafeString: ...
    @overload
    def __add__(self, rhs: str) -> str: ...

SafeText: TypeAlias = SafeString

_C = TypeVar("_C", bound=Callable[..., Any])

@overload
def mark_safe(s: _SD) -> _SD: ...
@overload
def mark_safe(s: _C) -> _C: ...
@overload
def mark_safe(s: _StrOrPromise) -> SafeString: ...
