""" Router "ticker" provides: - getting the ticker's raw content - getting the ticker's HTML content (using Markdown) - getting the ticker's UI config """ from logging import getLogger from typing import Iterator from fastapi import APIRouter, Depends from markdown import markdown from ...config import Config, TickerUIConfig from ...dav_common import webdav_ensure_files, webdav_ensure_path from ...dav_file import DavFile from .text import text_lister, text_unique _logger = getLogger(__name__) router = APIRouter(prefix="/ticker", tags=["text"]) @router.on_event("startup") async def start_router() -> None: _logger.debug(f"{router.prefix} router starting.") webdav_ensure_path(await text_lister.remote_path) webdav_ensure_files( await text_lister.remote_path, "ticker.txt", ) async def get_ticker_lines() -> Iterator[str]: cfg = await Config.get() file_name = await text_unique(cfg.ticker.file_name) ticker = await DavFile( f"{await text_lister.remote_path}/{file_name}", ).as_string return ( line.strip() for line in ticker.split("\n") if line.strip() ) async def get_ticker_content_lines( ticker_lines: Iterator[str] = Depends(get_ticker_lines), ) -> Iterator[str]: cfg = await Config.get() return ( line for line in ticker_lines if not line.startswith(cfg.ticker.comment_marker) ) async def get_ticker_content( ticker_content_lines: Iterator[str] = Depends(get_ticker_content_lines), ) -> str: ticker_content_padded = ["", *ticker_content_lines, ""] if len(ticker_content_padded) == 2: return "" cfg = await Config.get() ticker_content = cfg.ticker.separator.join( ticker_content_padded, ) return ticker_content.strip() @router.get("/html") async def get_ticker( ticker_content: str = Depends(get_ticker_content), ) -> str: return markdown(ticker_content) @router.get("/raw") async def get_raw_ticker( ticker_content: str = Depends(get_ticker_content), ) -> str: return ticker_content @router.get( "/config", response_model=TickerUIConfig, ) async def get_ui_config( cfg: Config = Depends(Config.get), ) -> TickerUIConfig: return cfg.ticker