Source code for scfile.convert.factory

"""
Decorator for registering named format converters.
"""

from collections import defaultdict
from copy import deepcopy
from functools import wraps
from typing import Callable, Optional, Type, TypeAlias

from scfile.core import ContentType, FileDecoder, FileEncoder, Options
from scfile.types import PathLike

from .convert import convert


ConverterMap: TypeAlias = dict[str, Callable]
ConverterRegistry: TypeAlias = dict[str, ConverterMap]

_REGISTRY: ConverterRegistry = defaultdict(dict)


[docs] def converters(src_format: str) -> ConverterMap: """Converters for source format.""" return deepcopy(_REGISTRY.get(src_format.lower().lstrip("."), {}))
[docs] def registry() -> ConverterRegistry: """Copy of full converter registry.""" return deepcopy(dict(_REGISTRY))
[docs] def converter( decoder: Type[FileDecoder[ContentType]], encoder: Type[FileEncoder[ContentType]], ) -> Callable: """Factory decorator for named conversion between two formats.""" def decorator(func: Callable): @wraps(func) def wrapper( source: PathLike, output: Optional[PathLike] = None, options: Optional[Options] = None, ): convert( decoder=decoder, encoder=encoder, source=source, output=output, options=options, ) _REGISTRY[decoder.format.lower()][encoder.format.lower()] = wrapper return wrapper return decorator