diff --git a/python/meson.build b/python/meson.build index d7475c8..a62f4ed 100644 --- a/python/meson.build +++ b/python/meson.build @@ -5,7 +5,7 @@ project( ).stdout().strip('\n'), # 'online.fxreader.uv', # ['c', 'cpp'], - version: '0.1.5.17+27.21', + version: '0.1.5.17+27.22', # default_options: [ # 'cpp_std=c++23', # # 'prefer_static=true', diff --git a/python/online/fxreader/pr34/commands_typed/pydantic.py b/python/online/fxreader/pr34/commands_typed/pydantic.py new file mode 100644 index 0000000..57aae96 --- /dev/null +++ b/python/online/fxreader/pr34/commands_typed/pydantic.py @@ -0,0 +1,82 @@ +import pydantic +import inspect +import collections + +from typing import ( + TypeVar, Callable, Any, Optional, + Mapping, cast, +) + +P = TypeVar('P') +R = TypeVar('R') + +def validate_params( + view: Callable[..., R] +) -> Callable[..., R]: + import inspect + + class Parameter: + kind: Any + annotation: Any + + parameters = cast( + Mapping[str, Parameter], + inspect.signature(view).parameters + ) + + positional_parameters: collections.OrderedDict[str, type[Any]] = \ + collections.OrderedDict(( + (k, v.annotation) + for k, v in parameters.items() + if v.kind in ( + inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD, + ) + )) + positional_names = list(positional_parameters) + + model = pydantic.create_model( + getattr(view, '__name__'), + **{ + k : v.annotation + for k, v in parameters.items() + if v.kind in ( + inspect.Parameter.POSITIONAL_OR_KEYWORD, + inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.KEYWORD_ONLY, + ) + }, + __config__=pydantic.ConfigDict( + arbitrary_types_allowed=True, + ) + ) + + def wrapper(*args: Any, **kwargs: Any) -> R: + #data = model.model_validate( + + kwargs_to_check : dict[str, Any] = { + k : v + for k, v in kwargs.items() + } + + for i, o in enumerate(args): + k = positional_names[i] + + parameter = positional_parameters[k] + + assert not k in kwargs_to_check + + kwargs_to_check[k] = o + + model.model_validate( + kwargs_to_check, + ) + #).dict() + + return view( + #**data, + *args, + **kwargs, + ) + + return wrapper