Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Libraries can define custom annotations to
indicate additional information not found
in the Schema
itself. For example, Protocol
Buffers requires a numerical identifier for
each field in a record.
Synopsis
- data Annotation domain typeName fieldName where
- AnnSchema :: domain -> Annotation domain typeName fieldName
- AnnType :: typeName -> domain -> Annotation domain typeName fieldName
- AnnField :: typeName -> fieldName -> domain -> Annotation domain typeName fieldName
- type family AnnotatedSchema domain (sch :: Schema typeName fieldName) :: [Annotation domain typeName fieldName]
- type AnnotationDomain = Type
- type family GetSchemaAnnotation (anns :: [Annotation domain t f]) :: domain where ...
- type family GetTypeAnnotation (anns :: [Annotation domain t f]) (ty :: t) :: domain where ...
- type family GetFieldAnnotation (anns :: [Annotation domain t f]) (ty :: t) (fl :: f) :: domain where ...
Annotate a schema
data Annotation domain typeName fieldName where Source #
Annotations proper.
AnnSchema :: domain -> Annotation domain typeName fieldName | Annotation over the whole schema. |
AnnType :: typeName -> domain -> Annotation domain typeName fieldName | Annotation over a type in the schema. |
AnnField :: typeName -> fieldName -> domain -> Annotation domain typeName fieldName | Annotation over a field in a record or a choice in an enumeration. |
type family AnnotatedSchema domain (sch :: Schema typeName fieldName) :: [Annotation domain typeName fieldName] Source #
This type family links each schema to its corresponding annotations from one domain.
type AnnotationDomain = Type Source #
Each annotation belongs to a domain.
Find annotations for an element
type family GetSchemaAnnotation (anns :: [Annotation domain t f]) :: domain where ... Source #
Find the annotation over the schema in the given set.
If the annotation cannot be found, raise a TypeError
.
GetSchemaAnnotation '[] = TypeError ('Text "cannot find schema annotation") | |
GetSchemaAnnotation ('AnnSchema d ': rs) = d | |
GetSchemaAnnotation (r ': rs) = GetSchemaAnnotation rs |
type family GetTypeAnnotation (anns :: [Annotation domain t f]) (ty :: t) :: domain where ... Source #
Find the annotation over the given type in the given set.
If the annotation cannot be found, raise a TypeError
.
GetTypeAnnotation '[] ty = TypeError ('Text "cannot find annotation for " :<>: 'ShowType ty) | |
GetTypeAnnotation ('AnnType ty d ': rs) ty = d | |
GetTypeAnnotation (r ': rs) ty = GetTypeAnnotation rs ty |
type family GetFieldAnnotation (anns :: [Annotation domain t f]) (ty :: t) (fl :: f) :: domain where ... Source #
Find the annotation over the given field or choice in the given type.
If the annotation cannot be found, raise a TypeError
.
GetFieldAnnotation '[] ty fl = TypeError ((('Text "cannot find annotation for " :<>: 'ShowType ty) :<>: 'Text "/") :<>: 'ShowType fl) | |
GetFieldAnnotation ('AnnField ty fl d ': rs) ty fl = d | |
GetFieldAnnotation (r ': rs) ty fl = GetFieldAnnotation rs ty fl |