Validate schemas¶
Module contains base schema for other complex pydantic models and simple schemas to use in other places
- class luna_handlers.classes.schemas.base_schema.BaseSchema(**data)[source]
Base schema model
- class Config[source]
Pydantic model config
- class luna_handlers.classes.schemas.base_schema.HandlerSettings[source]
Container class for service settings.
- classmethod initialize(faceDescriptorVersion, bodyDescriptorVersion, livenessRealThreshold, livenessQualityThreshold, handlersLimitsSettings, attributeStorageSettings)[source]
Initialize settings for schemas.
- Parameters:
faceDescriptorVersion – default face descriptor version
bodyDescriptorVersion – default body descriptor version
livenessRealThreshold – default liveness threshold setting
handlersLimitsSettings – luna handlers limits settings
attributeStorageSettings – attribute storage settings
- class luna_handlers.classes.schemas.base_schema.SchemaUpdaterMixin[source]
Extended base schema model.
- settings
alias of
HandlerSettings
- classmethod update()[source]
Update inherit schema.
- classmethod updateSchemas()[source]
Run settings update for inherited schemas.
Module contains schemas for attribute upgrade handler
- class luna_handlers.classes.schemas.attribute_upgrade.BodyUpgradeData(**data)[source]
Body upgrade data schema
- class luna_handlers.classes.schemas.attribute_upgrade.BodyUpgradePolicy(**data)[source]
Body attribute upgrade policy
- class luna_handlers.classes.schemas.attribute_upgrade.FaceUpgradeData(**data)[source]
Face upgrade data schema
- class luna_handlers.classes.schemas.attribute_upgrade.FaceUpgradePolicy(**data)[source]
Face attribute upgrade policy
- classmethod validatePolicy(values)[source]
Validate attributes are select for extract :raises VLException(Error.NotSelectedAttributesForExtract, 400, False) if no attributes select for extract:
- class luna_handlers.classes.schemas.attribute_upgrade.SamplesForUpgrade(**data)[source]
Samples for upgrade schema
- classmethod validateOneOf(values)[source]
Validate one of request value:
‘face_id’ and ‘upgrade_data’ or ‘event_id’ and ‘face_upgrade_data’ and/or ‘body_upgrade_data’
Module contains schemas for conditional tags policy
- class luna_handlers.classes.schemas.conditional_tags_policy.ConditionalTagsPolicy(**data)[source]
Conditional tags policy schema
- execute(events)[source]
Execute additional tags policy
- Parameters:
events – processing events
- Return type:
None
- class luna_handlers.classes.schemas.conditional_tags_policy.Tag[source]
Tag schema
Module contains schemas for detector handler
- class luna_handlers.classes.schemas.detector.Detector(**data)[source]
Model for detector handler with urls or samples
- static checkRequiredFaceBBox(values)[source]
Check required face bounding box for incoming image
- classmethod validateHandler(values)[source]
Validate handler model
- Return type:
dict
Module contains schemas for extract policy
- class luna_handlers.classes.schemas.extract_policies.BaseExtractPolicy(**data)[source]
Base extract policy
- class luna_handlers.classes.schemas.extract_policies.HandlerExtractPolicy(**data)[source]
Handler extract policy schema
Module contains schemas for extractor handler
- class luna_handlers.classes.schemas.extractor.Extractor(**data)[source]
Model for extractor handler with samples
Module contains schemas for filters
- class luna_handlers.classes.schemas.filters.AttributesFilters(**data)[source]
Matching filters schema
- property isEmpty: bool
Check there is nothing to filter.
- Returns:
True if all filters are equal to their defaults
- Return type:
bool
- isEventSatisfies(event)[source]
Does event satisfy filters by face attributes.
- Parameters:
event – event
- Returns:
true if event satisfied a filters otherwise false
- Return type:
bool
- class luna_handlers.classes.schemas.filters.ComplexFilter(**data)[source]
Complex filter - includes attributes and list of match filters
- property isEmpty: bool
Check there is nothing to filter.
- Returns:
True if all filters are equal to None
- Return type:
bool
- isEventSatisfies(event)[source]
Does an event satisfy the filters.
- Parameters:
event – event
- Returns:
true if event satisfied filters otherwise false
- Return type:
bool
- class luna_handlers.classes.schemas.filters.MatchFilter(**data)[source]
Simple match filter
- property isEmpty: bool
Check there is nothing to filter.
- Returns:
True if all filters are equal to their defaults
- Return type:
bool
Module contains schemas for handler
- class luna_handlers.classes.schemas.handler.CachedHandlerModel(**data)[source]
Cached handler model | contains minimal required fields
- classmethod postInit(values)[source]
Post init
- static postInitMatchPolicy(matchPolicies, accountId)[source]
Post init matching policy - apply handler account id for matching candidates :param matchPolicies: matching policies :param accountId: handler account id
- Return type:
None
- class luna_handlers.classes.schemas.handler.CreateHandlerModel(**data)[source]
Handler model for handler creation
- classmethod validateNPostInit(values)[source]
Validate handler, post init
- class luna_handlers.classes.schemas.handler.FaceInputEstimationsModel(**data)[source]
Model for incoming face estimations: urls, image or samples
- classmethod validateHandler(values)[source]
Validate handler model
- Return type:
dict
- class luna_handlers.classes.schemas.handler.HandlerInputEstimationsModel(*, image: ~typing.Optional[str] = None, mimetype: ~typing.Optional[str] = None, face_bounding_boxes: ~types.ConstrainedListValue[~classes.schemas.simple_schemas.BoundingBoxSchema] = None, body_bounding_boxes: ~types.ConstrainedListValue[~classes.schemas.simple_schemas.BoundingBoxSchema] = None, urls: ~classes.schemas.types.userConstrainedList.<locals>.UserConstrainedList[~luna_handlers.classes.schemas.handler.UrlForInputEvent] = None, samples: ~typing.Union[~classes.schemas.types.userConstrainedList.<locals>.UserConstrainedList[~luna_handlers.classes.schemas.handler.SampleForInputEvent], ~classes.schemas.types.userConstrainedList.<locals>.UserConstrainedList[~uuid.UUID]] = None, detect_time: ~classes.schemas.types.CustomDatetime = None, detect_ts: ~typing.Optional[~classes.schemas.types.DetectTs] = None, image_origin: ~classes.schemas.types.Str256 = None)[source]
Handler model for incoming estimations: urls, image(with face and/or body bounding boxes) or samples
- classmethod validateHandler(values)[source]
Validate handler model
- Return type:
dict
- class luna_handlers.classes.schemas.handler.SampleForInputEvent(**data)[source]
Sample schema
- class luna_handlers.classes.schemas.handler.UrlForInputEvent(**data)[source]
Url schema with detection time and image origin
- class luna_handlers.classes.schemas.handler.ValidatorHandlerModel(**data)[source]
Handler validator model
Module contains schemas for match policy
- class luna_handlers.classes.schemas.match_policy.AttributeMatchCandidates(**data)[source]
Face match candidates
- class luna_handlers.classes.schemas.match_policy.BaseMatchPolicy(**data)[source]
Base match policy schema
- classmethod descriptorValidator(descriptor, values)[source]
Candidate descriptor parameters validator, depends on matching candidates
- Return type:
Optional
[str
,None
]
- async execute(events, luna3Client)[source]
- Execute match policy:
filter events fo matching
match events’ descriptors with policy candidates
Results are stored in the input events.
- Parameters:
events – events (references)
luna3Client – client
- Return type:
None
- classmethod targetsValidator(targets, values)[source]
Targets validator, depends on matching candidates
- Return type:
Optional
[List
[str
],None
]
- class luna_handlers.classes.schemas.match_policy.EventMatchCandidates(**data)[source]
Event match candidates
- class luna_handlers.classes.schemas.match_policy.EventMatchResult(matchingLabel, matchResult)[source]
Event match result.
- candidates
match candidates
- listInfo
matching list info
- matchingLabel
matching label
- asDict()[source]
Get Event match results without matching label as dict :returns: dict with matching candidates and matching label
- Return type:
dict
- class luna_handlers.classes.schemas.match_policy.FaceMatchCandidates(**data)[source]
Face match candidates
- class luna_handlers.classes.schemas.match_policy.GeoPosition(**data)[source]
Geo position: longitude and latitude with deltas
- class luna_handlers.classes.schemas.match_policy.MatchPolicy(**data)[source]
Match policy schema
- class luna_handlers.classes.schemas.match_policy.MatchingDescriptor(**data)[source]
Matching descriptor parameters
- class luna_handlers.classes.schemas.match_policy.OriginEnum(value)[source]
Match candidates origin
Module contains schemas for policies
- class luna_handlers.classes.schemas.policies.HandlerConfig(facesBucket, bodiesBucket, originBucket, lunaEventsUsage, lunaSenderUsage, aggregate, useExifInfo, useAutoRotation, faceDescriptorVersion, bodyDescriptorVersion)[source]
Handler config that policies should apply.
- class luna_handlers.classes.schemas.policies.Policies(**data)[source]
Policies schema
- async checkListsAvailability(luna3Client, accountId)[source]
Check availability of lists from matching and link to list policies.
- Parameters:
luna3Client – luna platform client
accountId – account id
- Raises:
VLException(Error.ListNotFound.format(listId), 400, False), if some list is not found –
- Return type:
None
- async execute(inputData, eventMetadata, config, luna3Client, redisContext, plugins)[source]
Execute all policies for handler.
- Parameters:
inputData – input data (images / raw descriptors)
eventMetadata – user defined event metadata
config – handler configuration parameters
luna3Client – luna platform client
redisContext – redis context
plugins – plugin manager
- Returns:
estimations in api format
monitoring data
- Return type:
tuple
[dict
,HandlersMonitoringData
]
- property extendedEstimationTargets: ExtendedEstimationTargets
Get extended estimation targets
- async classmethod onShutdown()[source]
Stop Policies
- async classmethod onStartup()[source]
Init Policies
- prepareSDKTaskParams(config)[source]
Prepare sdk task parameters
- Returns:
sdk task parameters
- publishEventsToPlugins(events, plugins)[source]
Publish events to other services.
- Parameters:
events – list of events
plugins – plugin manager
- Return type:
None
- property sdkFilters: Filters
Prepare sdk task filters
- Returns:
sdk task filters
- static validateDetectAndExtractCompatibility(detectPolicy, extractPolicy)[source]
Validate detect and extract policies compatibility
- static validateDetectPolicyNotEmpty(detectPolicy)[source]
Validate non-empty detect policy
- static validateGeneratedAttributesFilters(detectPolicy, extractPolicy, matchPolicies, conditionalTagsPolicies, storagePolicy)[source]
Validate attributes and detect/extract policy compatibility
- static validateMatchAndExtractCompatibility(matchPolicies, extractPolicy)[source]
Validate match and extract policies compatibility
- static validateMatchLabelsCompatibility(matchPolicies, conditionalTagsPolicies, storagePolicy)[source]
Validate matching label compatibility
- static validateMatchPolicyUniqueLabels(matchPolicies)[source]
Validate match policy matching label uniqueness
- classmethod validatePolicies(values)[source]
Execute all compatibility validators
- async luna_handlers.classes.schemas.policies.checkListAvailability(luna3Client, listId, accountId=None)[source]
Check availability of list.
- Parameters:
luna3Client – luna platform client
accountId – account id
listId – list id
- Returns:
Response from luna-faces service
- Return type:
LunaResponse
- luna_handlers.classes.schemas.policies.getObjectRecursively(data, expectedType)[source]
Recursively get object of expected type
- Return type:
list
[~T]
Module contains schemas for multipart requests
- class luna_handlers.classes.schemas.multipart.FileNameWithBodyBBs(**data)[source]
Model for filename with body bounding boxes
- class luna_handlers.classes.schemas.multipart.FileNameWithDetectionRelativeTimestamp(**data)[source]
Model for list of filename with image detect relative detection timestamp
- class luna_handlers.classes.schemas.multipart.FileNameWithDetectionTime(**data)[source]
Model for list of filename with image detect time
- class luna_handlers.classes.schemas.multipart.FileNameWithFaceBBs(**data)[source]
Model for filename with face bounding boxes
- class luna_handlers.classes.schemas.multipart.FileNameWithImageOrigin(**data)[source]
Model for list of filename with image origin
Module contains schemas for sdk handler
- class luna_handlers.classes.schemas.sdk.SDKInputEstimationsModel(**data)[source]
SDK model for incoming estimations: urls, samples or image with/without face/body bounding boxes
- classmethod validateHandler(values)[source]
Validate handler model
- Return type:
dict
Module contains simple schemas for multiple usage
- class luna_handlers.classes.schemas.simple_schemas.BoundingBoxSchema(**data)[source]
Bounding box schema
- class luna_handlers.classes.schemas.simple_schemas.UrlBboxSchema(**data)[source]
Url with face and body bounding boxes schema
- class luna_handlers.classes.schemas.simple_schemas.UrlWithFaceBbox(**data)[source]
Url with face bounding boxes schema
Module contains schemas for storage policy
- class luna_handlers.classes.schemas.storage_policy.AttributeStorePolicy(**data)[source]
Attribute store policy
- async execute(events, luna3Client)[source]
Save attributes.
- Parameters:
events – events
luna3Client – client
- Return type:
None
- class luna_handlers.classes.schemas.storage_policy.BodySamplePolicy(**data)[source]
Body sample policy
- async execute(events, sources, bucket, luna3Client)[source]
Save body samples.
- Parameters:
events – events
sources – origin image sources
bucket – bucket name
luna3Client – client
- class luna_handlers.classes.schemas.storage_policy.EventStoragePolicy(**data)[source]
Event store policy
- async execute(accountId, events, luna3Client, lunaEventsUsage)[source]
Save events.
- Parameters:
accountId – account id
events – events
luna3Client – client
lunaEventsUsage – use or not luna events
- Return type:
None
- async classmethod onShutdown()[source]
Stop Policies
- async classmethod onStartup()[source]
Init Policies
- class luna_handlers.classes.schemas.storage_policy.FaceSamplePolicy(**data)[source]
Face sample policy
- async execute(events, sources, bucket, luna3Client)[source]
Save face samples.
- Parameters:
events – events
sources – origin image sources
bucket – bucket name
luna3Client – client
- class luna_handlers.classes.schemas.storage_policy.FaceStoragePolicy(**data)[source]
Face store policy
- async execute(events, luna3Client)[source]
Execute face policy (with link to list policy).
- Parameters:
events – processing events
luna3Client – luna3 client
- Return type:
None
- class luna_handlers.classes.schemas.storage_policy.ImageOriginPolicy(**data)[source]
Image origin policy
- async execute(events, sources, bucket, luna3Client)[source]
Save origin images.
- Parameters:
events – events
sources – origin image sources
bucket – bucket name
luna3Client – client
- Return type:
None
- class luna_handlers.classes.schemas.storage_policy.LinkToListsPolicy(**data)[source]
Link to lists policy schema
- class luna_handlers.classes.schemas.storage_policy.MetaAttribute(sdkAttribute, sampleIds)[source]
Attribute.
- class luna_handlers.classes.schemas.storage_policy.MetaWarp(warpedImage, sampleId=None)[source]
Warp.
- sampleId
sample id
- Type:
str
- warpedImage
warped image
- Type:
Union[bytes, FaceWarpedImage, BodyWarpedImage]
- asBytes()[source]
- Returns:
warp binary representation
- Return type:
bytes
- class luna_handlers.classes.schemas.storage_policy.NotificationStoragePolicy(**data)[source]
Notification store policy
- async execute(events, redisContext, lunaSenderUsage)[source]
Save notifications :param events: events :param redisContext: redis context :param lunaSenderUsage: use or not luna sender
- Return type:
None
- class luna_handlers.classes.schemas.storage_policy.StoragePolicy(**data)[source]
Storage policy schema
- async execute(accountId, sources, events, config, luna3Client, redisContext)[source]
Execute storage policy - save objects.
- Parameters:
accountId – account id
sources – origin image sources
events – events to process
config – app config
luna3Client – client
redisContext – redis context
- Returns:
monitoring data
- Return type:
HandlersMonitoringData
- class luna_handlers.classes.schemas.storage_policy.StorePolicyConfig(facesBucket, bodiesBucket, originBucket, lunaEventsUsage, lunaSenderUsage)[source]
Handler config that policies should apply.
- async luna_handlers.classes.schemas.storage_policy.saveAttributes(attributesToSave, accountId, facesClient, ttl)[source]
Save attributes.
- Parameters:
attributesToSave – attributes
accountId – account id
facesClient – faces client
ttl – time to store attribute
- Return type:
None
- async luna_handlers.classes.schemas.storage_policy.saveSamples(warpsToSave, bucket, accountId, storeApiClient)[source]
Save warps in LIS.
- Parameters:
warpsToSave – SDK warps to save
bucket – bucket name
accountId – account id
storeApiClient – image-store client
Module contains schemas for verifier
- class luna_handlers.classes.schemas.verifier.VerifierAttributeStorePolicy(**data)[source]
Verifier attribute storage policy
- async execute(events, luna3Client)[source]
Save attributes.
- Parameters:
events – events
luna3Client – client
- Return type:
None
- class luna_handlers.classes.schemas.verifier.VerifierConfig(useExifInfo, useAutoRotation, faceDescriptorVersion, facesBucket)[source]
Verifier config that policies should apply.
- class luna_handlers.classes.schemas.verifier.VerifierDetectPolicy(**data)[source]
Verifier detect policy
- class luna_handlers.classes.schemas.verifier.VerifierExtractPolicy(**data)[source]
Verifier extract policy
- class luna_handlers.classes.schemas.verifier.VerifierFaceSampleStorePolicy(**data)[source]
Verifier face sample storage policy
- async execute(events, sources, bucket, luna3Client)[source]
Save face samples.
- Parameters:
events – events
bucket – bucket name
luna3Client – client
- class luna_handlers.classes.schemas.verifier.VerifierInputEstimationsModel(**data)[source]
Verifier model for incoming estimations: urls, image (only face bounding boxes available) or samples
- class luna_handlers.classes.schemas.verifier.VerifierMatchPolicy(**data)[source]
Verifier match policy schema
- class luna_handlers.classes.schemas.verifier.VerifierModel(**data)[source]
Verifier
- class luna_handlers.classes.schemas.verifier.VerifierPoliciesModel(**data)[source]
Verifier policies
- buildVerifications(matches)[source]
Build verification result in api format. :param matches: matches result
- Returns:
verification result in api format
- Return type:
list
[dict
]
- async execute(inputData, config, matchPolicies, accountId, luna3Client, facesBucket)[source]
Executes given policies against provided data.
- Parameters:
inputData – input data (images / raw descriptors)
config – handler configuration parameters
matchPolicies – MatchingPolicy instances
accountId – A str, account id
luna3Client – A luna3 client instance
facesBucket – faces samples bucket
- Returns:
estimations in api format
monitoring data
- Return type:
tuple
[dict
,HandlersMonitoringData
]
- prepareSDKTaskParams(config)[source]
Prepare sdk task parameters
- Returns:
sdk task parameters
- property sdkFilters: Filters
Prepare sdk task filters
- Returns:
sdk task filters
- property sdkTargets: set[Union[sdk.sdk_loop.enums.LoopEstimations, classes.schemas.estimation_targets.ResponseOnlyEstimations]]
Prepare sdk task targets
- Returns:
sdk task targets
- class luna_handlers.classes.schemas.verifier.VerifierStoragePolicy(**data)[source]
Verifier storage policy
- async execute(sources, events, luna3Client, facesBucket)[source]
Execute storage policy - save objects. :param sources: origin image sources :param events: events :param facesBucket: faces samples bucket :param luna3Client: luna3 client
- Returns:
monitoring data
- Return type:
HandlersMonitoringData
Types¶
Module contains custom basics for validation schemas It highly recommended to use represented classes instead of pydantic defaults!
- luna_handlers.classes.schemas.types.BodyDescriptorVersion
alias of
_Class
- luna_handlers.classes.schemas.types.Choice(options, title='')[source]
Choice model generator :param options: available options :param title: title fo option
- Returns:
Class for pydantic with choice validation
- Return type:
Type
[~T]
- class luna_handlers.classes.schemas.types.CustomDatetime[source]
Custom extended datetime - do not use default if it needs to get attribute as str in ISO-format,
- classmethod validateDatetime(value)[source]
Validate value is not string :param value: input value
- Returns:
datetime in string format
- Return type:
str
- class luna_handlers.classes.schemas.types.CustomExtendedDatetime[source]
Custom datetime - do not use default if it needs to get attribute as str in ISO-format
- classmethod initialize(storageTime)[source]
Initialize storage time :param storageTime: storage time - utc or local
- classmethod validateDatetime(value)[source]
Validate value is not string :param value: input value
- Returns:
datetime in string format
- Return type:
str
- class luna_handlers.classes.schemas.types.CustomFloat[source]
Custom float - same as default pydantic non-strict float, but not allow to use string as float
- classmethod validateNonStr(value)[source]
Validate value is not string
- Return type:
float
- class luna_handlers.classes.schemas.types.DetectTs[source]
User-defined timestamp relative to something, such as the start of a video
- luna_handlers.classes.schemas.types.FaceDescriptorVersion
alias of
_Class
- class luna_handlers.classes.schemas.types.Float180[source]
Strict float in range -180 to 180
- class luna_handlers.classes.schemas.types.FloatGeoDelta(x=0, /)[source]
Non-strict float for latitude in range 0.0 - 9.0
- class luna_handlers.classes.schemas.types.FloatLatitude(x=0, /)[source]
Non-strict float for latitude in range -90.0 - 90.0
- class luna_handlers.classes.schemas.types.FloatLongitude(x=0, /)[source]
Non-strict float for longitude in range -180.0 - 180.0
- class luna_handlers.classes.schemas.types.GeoPosition(**data)[source]
- class luna_handlers.classes.schemas.types.Int01[source]
Int in range 0 - 1
- class luna_handlers.classes.schemas.types.Int02[source]
Int in range 0 - 2
- class luna_handlers.classes.schemas.types.IntAge[source]
Int in range 0 - 100
- class luna_handlers.classes.schemas.types.IntAngle180[source]
Int for angles - in range 0 - 180
- class luna_handlers.classes.schemas.types.IntAttributeTTL[source]
Int in range 0 - MAX_ATTRIBUTE_TTL
- classmethod update()[source]
Update inherit schema.
- class luna_handlers.classes.schemas.types.IntEmotions[source]
Int in range of available emotions values
- class luna_handlers.classes.schemas.types.IntEthnicities[source]
Int in range of available ethnicities values
- class luna_handlers.classes.schemas.types.IntLiveness[source]
Int in range of available liveness state values
- class luna_handlers.classes.schemas.types.IntMasks[source]
Int in range of available masks values
- class luna_handlers.classes.schemas.types.IntMatchingLimit[source]
Int in range 0 - RESULT_CANDIDATE_LIMIT
- classmethod update()[source]
Update inherit schema.
- class luna_handlers.classes.schemas.types.IntNonNegative[source]
Int non negative
- luna_handlers.classes.schemas.types.OptionalNotNullable()[source]
Pydantic hack for not required not nullable fields. If field does not present in an input json will be initialize of the None, if field is present as null in the input json will be raise corresponding error. .. rubric:: Examples
>>> class A(BaseModel): >>> id: int >>> description: str = OptionalNotNullable() if input json is equal to `{"id": 1, "description": None}` will be raize the error. if input json is equal to `{"id": 1}` will be correct parsing.
- Returns:
Field with default None
- Return type:
Any
- class luna_handlers.classes.schemas.types.SDKInt[source]
Int in range from min to max SDK magic numbers
- class luna_handlers.classes.schemas.types.Str128[source]
Strict string 128 len max
- class luna_handlers.classes.schemas.types.Str256[source]
Strict string 128 len max
- class luna_handlers.classes.schemas.types.Str36[source]
Strict string 36 len max
- class luna_handlers.classes.schemas.types.StrictFloat01[source]
Strict float in range 0.0 - 1.0
- class luna_handlers.classes.schemas.types.StrictFloatNonNegative[source]
Strict float non negative
- luna_handlers.classes.schemas.types.getNonNullableOptionalListField(maxItems=None, minItems=None)[source]
Get non nullable optional list field - there is no default mechanism in pydantic at the moment :param maxItems: max list items :param minItems: min list items
- Returns:
prepared pydantic Field
- Return type:
Field
- luna_handlers.classes.schemas.types.isNumber(value)[source]
Check that object is float or int :param value: object
- Returns:
object
- Raises:
FloatError – if object is not number
- luna_handlers.classes.schemas.types.userConstrainedList(itemType, minItems=None, maxItems=None, minItemsGetter=None, maxItemsGetter=None)[source]
Create pydantic constrained list for schema validation. Update list constraints after creating a service app.
- Parameters:
itemType – list item type
minItems – set min items permanently
maxItems – set max items permanently
minItemsGetter – set min items from callable object
maxItemsGetter – set max items from callable object
- Returns:
user constrained list
- Return type:
Type
[List
[~T]]