from typing import Any

from botocore.client import BaseClient
from botocore.utils import get_service_module_name as get_service_module_name

from . import xform_name as xform_name
from .exceptions import ClientError as ClientError
from .exceptions import WaiterConfigError as WaiterConfigError
from .exceptions import WaiterError as WaiterError

def create_waiter_with_client(
    waiter_name: str, waiter_model: WaiterModel, client: BaseClient
) -> Waiter: ...

class NormalizedOperationMethod:
    def __init__(self, client_method: Any) -> None: ...
    def __call__(self, **kwargs: Any) -> Any: ...

class WaiterModel:
    SUPPORTED_VERSION: int = ...
    version: Any = ...
    waiter_names: Any = ...
    def __init__(self, waiter_config: Any) -> None: ...
    def get_waiter(self, waiter_name: Any) -> Any: ...

class SingleWaiterConfig:
    description: Any = ...
    operation: Any = ...
    delay: Any = ...
    max_attempts: Any = ...
    def __init__(self, single_waiter_config: Any) -> None: ...
    @property
    def acceptors(self) -> Any: ...

class AcceptorConfig:
    state: Any = ...
    matcher: Any = ...
    expected: Any = ...
    argument: Any = ...
    matcher_func: Any = ...
    def __init__(self, config: Any) -> None: ...
    @property
    def explanation(self) -> Any: ...

class Waiter:
    name: Any = ...
    config: Any = ...
    def __init__(self, name: Any, config: Any, operation_method: Any) -> None: ...
    def wait(self, **kwargs: Any) -> None: ...
