Coverage for src / dynapydantic / union_mode.py: 100%

8 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-17 17:07 +0000

1"""Union mode configuration types for dynapydantic.""" 

2 

3import typing as ty 

4from collections.abc import Callable 

5 

6import pydantic 

7 

8 

9class DiscriminatedConfig(pydantic.BaseModel, frozen=True, extra="forbid"): 

10 """Configuration for a discriminated union. 

11 

12 Carries the discriminator field name and optional value generator that 

13 are required when pydantic's discriminated-union validation strategy is 

14 used. 

15 """ 

16 

17 discriminator_field: str = pydantic.Field( 

18 description="Name of the field used to discriminate between subtypes.", 

19 ) 

20 discriminator_value_generator: Callable[[type], str] | None = pydantic.Field( 

21 None, 

22 description=( 

23 "A callable that produces default values for the discriminator " 

24 "field when none is supplied via register()." 

25 ), 

26 ) 

27 

28 

29#: Literal type for the two non-discriminated union strategies. 

30NonDiscriminatedMode = ty.Literal["smart", "left_to_right"] 

31 

32#: Full union-mode type. Either a structured `DiscriminatedMode` 

33#: (the default) or one of the plain string literals for the two 

34#: non-discriminated strategies. 

35UnionMode = DiscriminatedConfig | NonDiscriminatedMode