Source code for betty.plugin.assertion

"""
Provide plugin assertions.
"""

from typing import Any, TypeVar

from betty.assertion import AssertionChain, assert_str
from betty.assertion.error import AssertionFailed
from betty.locale.localizable import _, join, do_you_mean
from betty.plugin import Plugin, PluginNotFound, PluginIdToTypeMapping

_PluginT = TypeVar("_PluginT", bound=Plugin)


[docs] def assert_plugin( plugin_id_to_type_mapping: PluginIdToTypeMapping[_PluginT], ) -> AssertionChain[Any, type[_PluginT]]: """ Assert that a value is a plugin ID. """ def _assert( value: Any, ) -> type[_PluginT]: plugin_id = assert_str()(value) try: return plugin_id_to_type_mapping[plugin_id] except PluginNotFound: raise AssertionFailed( join( _( 'Cannot find and import "{plugin_id}".', ).format(plugin_id=plugin_id), do_you_mean( *(f'"{plugin_id}"' for plugin_id in plugin_id_to_type_mapping) ), ) ) from None return AssertionChain(_assert)