1# Copyright (c) 2020 Dmitry Marakasov <amdmi3@amdmi3.ru> 2# 3# Permission is hereby granted, free of charge, to any person obtaining a copy 4# of this software and associated documentation files (the "Software"), to deal 5# in the Software without restriction, including without limitation the rights 6# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7# copies of the Software, and to permit persons to whom the Software is 8# furnished to do so, subject to the following conditions: 9# 10# The above copyright notice and this permission notice shall be included in 11# all copies or substantial portions of the Software. 12# 13# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19# THE SOFTWARE. 20 21from typing import Any, Dict, Iterator, List, Tuple 22 23from aesqlapius.function_def import ArgumentDefinition, FunctionDefinition 24 25 26def _iter_args(func_def: FunctionDefinition, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Iterator[Tuple[ArgumentDefinition, Any]]: 27 for narg, arg in enumerate(func_def.args): 28 value: Any = None 29 if narg < len(args): 30 if arg.name in kwargs: 31 raise TypeError(f"{func_def.name} got multiple values for argument '{arg.name}'") 32 value = args[narg] 33 elif arg.name in kwargs: 34 value = kwargs[arg.name] 35 elif arg.has_default: 36 value = arg.default 37 else: 38 raise TypeError(f"{func_def.name} missing required argument '{arg.name}'") 39 40 yield arg, value 41 42 43def prepare_args_as_dict(func_def: FunctionDefinition, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Dict[str, Any]: 44 return {arg.name: value for arg, value in _iter_args(func_def, args, kwargs)} 45 46 47def prepare_args_as_list(func_def: FunctionDefinition, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> List[Any]: 48 return [value for arg, value in _iter_args(func_def, args, kwargs)] 49