qrate/session.py

43 lines
1.1 KiB
Python

"""
Per-user conversation state machine.
"""
from dataclasses import dataclass, field
from enum import Enum, auto
from typing import Optional
from qobuz_client import AlbumItem, SearchItem
class State(Enum):
IDLE = auto() # waiting for a search query
RESULTS = auto() # results shown, waiting for a numbered choice
ARTIST_OPTIONS = auto() # artist chosen, waiting for "1" or "2"
DOWNLOADING = auto() # download in progress
@dataclass
class ResultEntry:
"""One numbered line shown to the user."""
display: str # text shown in the list
kind: str # "artist" or "album"
item: SearchItem # original search item (has .url)
@dataclass
class PendingArtist:
name: str
albums: list[AlbumItem] # full album list, sorted newest-first
@dataclass
class UserSession:
state: State = State.IDLE
entries: list[ResultEntry] = field(default_factory=list)
pending_artist: Optional[PendingArtist] = None
def reset(self) -> None:
self.state = State.IDLE
self.entries = []
self.pending_artist = None