#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# IMPORTS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

from src.thirdparty.code import *;
from src.thirdparty.config import *;
from src.thirdparty.system import *;
from src.thirdparty.types import *;

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# EXPORTS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

__all__ = [
    'get_env_string',
    'get_env_optional_string',
    'get_env_int',
    'get_env_optional_int',
    'get_env_float',
    'get_env_optional_float',
];

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# AUXILIARY METHODS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def get_env_value(env: dict, key: str, default: Any = None) -> Any: # pragma: no cover
    return env[key] if key in env else default;

def get_env_string(env: dict, key: str, default: Optional[str] = None) -> str:
    result = Result.of(lambda: str(env[key] or default));
    if default is None:
        return result.unwrap();
    return result.unwrap_or(default);

def get_env_optional_string(env: dict, key: str) -> Optional[str]:
    result = Result.of(lambda: str(env[key]));
    return result.unwrap_or(None);

def get_env_int(env: dict, key: str, default: Optional[int] = None) -> int:
    result = Result.of(lambda: int(env[key] or default));
    if default is None:
        return result.unwrap();
    return result.unwrap_or(default);

def get_env_optional_int(env: dict, key: str) -> Optional[int]:
    result = Result.of(lambda: int(env[key]));
    return result.unwrap_or(None);

def get_env_float(env: dict, key: str, default: Optional[float] = None) -> float:
    result = Result.of(lambda: float(env[key] or default));
    if default is None:
        return result.unwrap();
    return result.unwrap_or(default);

def get_env_optional_float(env: dict, key: str) -> Optional[float]:
    result = Result.of(lambda: float(env[key]));
    return result.unwrap_or(None);
