# Path: src/booking/source/user/User.py
# class User:
# 
#     class Role(Enum):
#         USER = 0
#         ADMIN = 1
# 
#         def __new__(cls, value):
#             member = object.__new__(cls)
#             member._value = value
#             return member
# 
#         def __int__(self):
#             return self._value
# 
#     def __init__(self, username: str, name: str, surname: str, identifier: int, role: Role = Role.USER):
#         self._username = escape_none(username)
#         self._name = escape_none(name)
#         self._surname = escape_none(surname)
#         self._identifier = identifier
#         self._role = role
# 
#     def get_username(self) -> str:
#         return self._username
# 
#     def get_name(self) -> str:
#         return self._name
# 
#     def get_surname(self) -> str:
#         return self._surname
# 
#     def get_identifier(self) -> int:
#         return self._identifier
# 
#     def get_role(self) -> Role:
#         return self._role
# 
#     def set_role(self, role: Role):
#         self._role = role


from abc import ABC
from abc import abstractmethod
from .User import User
from typing import List


class UserSource(ABC):
    """
    Class that represents a source used to store and get the user that use the bot.
    """

    @abstractmethod
    def get_user_by_identifier(self, identifier: int) -> User:
        """
        Gets the user that have the identifier equal to the provided identifier.
        :param identifier: Identifier used to get the user.
        :return: Return the user that have the requested identifier, if the user is not present will return None.
        """
        pass


# Path: src/booking/source/user/User.py
# class User:
# 
#     class Role(Enum):
#         USER = 0
#         ADMIN = 1
# 
#         def __new__(cls, value):
#             member = object.__new__(cls)
#             member._value = value
#             return member
# 
#         def __int__(self):
#             return self._value
# 
#     def __init__(self, username: str, name: str, surname: str, identifier: int, role: Role = Role.USER):
#         self._username = escape_none(username)
#         self._name = escape_none(name)
#         self._surname = escape_none(surname)
#         self._identifier = identifier
#         self._role = role
# 
#     def get_username(self) -> str:
#         return self._username
# 
#     def get_name(self) -> str:
#         return self._name
# 
#     def get_surname(self) -> str:
#         return self._surname
# 
#     def get_identifier(self) -> int:
#         return self._identifier
# 
#     def get_role(self) -> Role:
#         return self._role
# 
#     def set_role(self, role: Role):
#         self._role = role


# Path: src/booking/source/user/UserSource.py
from abc import ABC
from abc import abstractmethod
from .User import User
from typing import List



class UserSource(ABC):
    """
    Class that represents a source used to store and get the user that use the bot.
    """

    @abstractmethod
    def get_user_by_identifier(self, identifier: int) -> User:
        """
        Gets the user that have the identifier equal to the provided identifier.
        :param identifier: Identifier used to get the user.
        :return: Return the user that have the requested identifier, if the user is not present will return None.
        """
        pass


    def get_all_users(self) -> List[User]: