"""API simple MSA search call wrappers.""" from contextlib import ExitStack from pathlib import Path import requests import typer from rich import print # pylint:disable=redefined-builtin from folding_studio.config import API_URL, REQUEST_TIMEOUT from folding_studio.utils.data_model import MSARequestParams from folding_studio.utils.headers import get_auth_headers from folding_studio.utils.project_validation import define_project_code_or_raise def simple_msa( file: Path, params: MSARequestParams, project_code: str | None = None, ) -> dict: """Make a simple MSA calculation from a file. Args: file (Path): Data source file path. params (MSARequestParams): API request parameters. project_code (str|None): Project code under which the jobs are billed. Raises: typer.Exit: If an error occurs during the API call. """ project_code = define_project_code_or_raise(project_code=project_code) url = API_URL + "searchMSA" with ExitStack() as stack: fasta_file = [("fasta_file", stack.enter_context(file.open("rb")))] files = fasta_file response = requests.post( url, data=params.model_dump(mode="json"), headers=get_auth_headers(), files=files, timeout=REQUEST_TIMEOUT, params={"project_code": project_code}, ) if not response.ok: print(f"An error occurred: {response.content.decode()}") raise typer.Exit(code=1) response_json = response.json() return response_json