"""
Getters for boto3 client and resource from session.
"""
from typing import Optional

from boto3.exceptions import ResourceNotExistsError
from boto3.session import Session
from boto3.resources.base import ServiceResource as Boto3ServiceResource
from botocore.client import BaseClient

from mypy_boto3_builder.service_name import ServiceName


def get_boto3_client(session: Session, service_name: ServiceName) -> BaseClient:
    """
    Get boto3 client from `session`.

    Arguments:
        session -- boto3 session.
        service_name -- ServiceName instance.

    Returns:
        Boto3 client.
    """
    return session.client(service_name.boto3_name)  # type: ignore


def get_boto3_resource(
    session: Session, service_name: ServiceName
) -> Optional[Boto3ServiceResource]:
    """
    Get boto3 resource from `session`.

    Arguments:
        session -- boto3 session.
        service_name -- ServiceName instance.

    Returns:
        Boto3 resource or None.
    """
    try:
        return session.resource(service_name.boto3_name)  # type: ignore
    except ResourceNotExistsError:
        return None
