|
12 | 12 | from ellar.common.interfaces import IExecutionContext |
13 | 13 | from ellar.pydantic import ( |
14 | 14 | BaseModel, |
15 | | - ErrorWrapper, |
16 | 15 | FieldInfo, |
17 | 16 | ModelField, |
18 | 17 | evaluate_forwardref, |
|
30 | 29 | IRouteParameterResolver, |
31 | 30 | SystemParameterResolver, |
32 | 31 | ) |
| 32 | +from ..resolvers.base import ResolverResult |
33 | 33 | from .extra_args import ExtraEndpointArg |
34 | 34 | from .factory import get_parameter_field |
35 | 35 | from .resolver_generators import ( |
36 | 36 | BulkArgsResolverGenerator, |
| 37 | + CookieResolverGenerator, |
37 | 38 | FormArgsResolverGenerator, |
38 | 39 | PathArgsResolverGenerator, |
39 | 40 | QueryHeaderResolverGenerator, |
40 | 41 | ) |
41 | 42 |
|
42 | | -BULK_RESOLVERS = { |
| 43 | +__BULK_RESOLVERS__ = { |
43 | 44 | str(params.FormFieldInfo): FormArgsResolverGenerator, |
44 | 45 | str(params.PathFieldInfo): PathArgsResolverGenerator, |
45 | 46 | str(params.QueryFieldInfo): QueryHeaderResolverGenerator, |
46 | 47 | str(params.HeaderFieldInfo): QueryHeaderResolverGenerator, |
| 48 | + str(params.CookieFieldInfo): CookieResolverGenerator, |
47 | 49 | } |
48 | 50 |
|
49 | 51 |
|
| 52 | +def add_get_resolver_generator( |
| 53 | + param: t.Type[params.ParamFieldInfo], |
| 54 | + resolver_gen: t.Type[BulkArgsResolverGenerator], |
| 55 | +) -> None: |
| 56 | + """ |
| 57 | + Add a custom Bulk resolver generator a custom route function parameter field type |
| 58 | + :param param: |
| 59 | + :param resolver_gen: |
| 60 | + :return: |
| 61 | + """ |
| 62 | + __BULK_RESOLVERS__[str(param)] = resolver_gen # pragma: no cover |
| 63 | + |
| 64 | + |
50 | 65 | def get_resolver_generator( |
51 | 66 | param: params.ParamFieldInfo, |
52 | 67 | ) -> t.Type[BulkArgsResolverGenerator]: |
53 | | - return BULK_RESOLVERS.get(str(type(param)), BulkArgsResolverGenerator) |
| 68 | + return __BULK_RESOLVERS__.get(str(type(param)), BulkArgsResolverGenerator) |
54 | 69 |
|
55 | 70 |
|
56 | 71 | def get_annotation_type_and_default( |
@@ -318,27 +333,21 @@ def _add_to_model(self, *, field: ModelField, key: t.Optional[str] = None) -> No |
318 | 333 | field_info.create_resolver(model_field=field) |
319 | 334 | ) |
320 | 335 |
|
321 | | - async def resolve_dependencies( |
322 | | - self, *, ctx: IExecutionContext |
323 | | - ) -> t.Tuple[t.Dict[str, t.Any], t.List[ErrorWrapper]]: |
324 | | - values: t.Dict[str, t.Any] = {} |
325 | | - errors: t.List[ErrorWrapper] = [] |
326 | | - |
327 | | - await self.resolve_body(ctx, values, errors) |
| 336 | + async def resolve_dependencies(self, *, ctx: IExecutionContext) -> ResolverResult: |
| 337 | + body_resolver = await self.resolve_body(ctx) |
328 | 338 |
|
329 | | - if not errors: |
| 339 | + if body_resolver and not body_resolver.errors: |
330 | 340 | for parameter_resolver in self._route_models: |
331 | | - value_, value_errors = await parameter_resolver.resolve(ctx=ctx) |
332 | | - if value_: |
333 | | - values.update(value_) |
334 | | - if value_errors: |
| 341 | + res = await parameter_resolver.resolve(ctx=ctx) |
| 342 | + if res.data: |
| 343 | + body_resolver.data.update(res.data) |
| 344 | + if res.errors: |
335 | 345 | _errors = ( |
336 | | - value_errors |
337 | | - if isinstance(value_errors, list) |
338 | | - else [value_errors] |
| 346 | + res.errors if isinstance(res.errors, list) else [res.errors] |
339 | 347 | ) |
340 | | - errors += _errors |
341 | | - return values, errors |
| 348 | + body_resolver.errors.extend(_errors) |
| 349 | + body_resolver.raw_data.update(res.raw_data) |
| 350 | + return body_resolver |
342 | 351 |
|
343 | 352 | def compute_extra_route_args(self) -> None: |
344 | 353 | self._add_extra_route_args(*self._extra_endpoint_args) |
@@ -372,24 +381,9 @@ def _add_extra_route_args( |
372 | 381 | ) |
373 | 382 | self._add_to_model(field=param_field, key=key) |
374 | 383 |
|
375 | | - async def resolve_body( |
376 | | - self, ctx: IExecutionContext, values: t.Dict, errors: t.List |
377 | | - ) -> None: |
| 384 | + async def resolve_body(self, ctx: IExecutionContext) -> ResolverResult: |
378 | 385 | """Body Resolver Implementation""" |
379 | | - |
380 | | - def __deepcopy__( |
381 | | - self, memodict: t.Optional[t.Dict] = None |
382 | | - ) -> "EndpointArgsModel": # pragma: no cover |
383 | | - if memodict is None: |
384 | | - memodict = {} |
385 | | - return self.__copy__(memodict) |
386 | | - |
387 | | - def __copy__( |
388 | | - self, memodict: t.Optional[t.Dict] = None |
389 | | - ) -> "EndpointArgsModel": # pragma: no cover |
390 | | - if memodict is None: |
391 | | - memodict = {} |
392 | | - return self |
| 386 | + return ResolverResult({}, [], {}) |
393 | 387 |
|
394 | 388 | def build_body_field(self) -> None: # pragma: no cover |
395 | 389 | raise NotImplementedError |
|
0 commit comments