Files
FastAnime/fastanime/libs/selectors/base.py
2025-08-11 23:57:34 +03:00

108 lines
3.1 KiB
Python

from abc import ABC, abstractmethod
from typing import List, Optional
class BaseSelector(ABC):
"""
Abstract Base Class for user-facing selectors (FZF, Rofi, etc.).
Defines the common interface for all selection operations.
"""
@abstractmethod
def choose(
self,
prompt: str,
choices: List[str],
*,
preview: Optional[str] = None,
header: Optional[str] = None,
) -> str | None:
"""
Prompts the user to choose one item from a list.
Args:
prompt: The message to display to the user.
choices: A list of strings for the user to choose from.
preview: An optional command or string for a preview window.
header: An optional header to display above the choices.
Returns:
The string of the chosen item.
"""
pass
@abstractmethod
def choose_multiple(
self,
prompt: str,
choices: List[str],
preview: Optional[str] = None,
) -> List[str]:
"""
Prompts the user to choose multiple items from a list.
Default implementation falls back to single selection.
Args:
prompt: The message to display to the user.
choices: A list of strings for the user to choose from.
preview: An optional command or string for a preview window.
header: An optional header to display above the choices.
Returns:
A list of the chosen items.
"""
pass
@abstractmethod
def confirm(self, prompt: str, *, default: bool = False) -> bool:
"""
Asks the user a yes/no question.
Args:
prompt: The question to ask the user.
default: The default return value if the user just presses Enter.
Returns:
True for 'yes', False for 'no'.
"""
pass
@abstractmethod
def ask(self, prompt: str, *, default: Optional[str] = None) -> str | None:
"""
Asks the user for free-form text input.
Args:
prompt: The question to ask the user.
default: An optional default value.
Returns:
The string entered by the user.
"""
pass
def search(
self,
prompt: str,
search_command: str,
*,
preview: Optional[str] = None,
header: Optional[str] = None,
) -> str | None:
"""
Provides dynamic search functionality that reloads results based on user input.
Args:
prompt: The message to display to the user.
search_command: The command to execute for searching/reloading results.
preview: An optional command or string for a preview window.
header: An optional header to display above the choices.
Returns:
The string of the chosen item.
Raises:
NotImplementedError: If the selector doesn't support dynamic search.
"""
raise NotImplementedError("Dynamic search is not supported by this selector")