Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data TypedSchemaFlex from a where
- TNamed :: SchemaName -> TypedSchemaFlex from' a' -> (a' -> a) -> (from -> from') -> TypedSchemaFlex from a
- TEnum :: NonEmpty (Text, a) -> (from -> Text) -> TypedSchemaFlex from a
- TArray :: TypedSchemaFlex b b -> (Vector b -> a) -> (from -> Vector b) -> TypedSchemaFlex from a
- TMap :: TypedSchemaFlex b b -> (HashMap Text b -> a) -> (from -> HashMap Text b) -> TypedSchemaFlex from a
- TAllOf :: NonEmpty (TypedSchemaFlex from a) -> TypedSchemaFlex from a
- TOneOf :: TypedSchemaFlex from' a' -> TypedSchemaFlex from'' a'' -> (Either a' a'' -> a) -> (from -> Either from' from'') -> TypedSchemaFlex from a
- TEmpty :: (Void -> a) -> (from -> Void) -> TypedSchemaFlex from a
- TPrim :: Text -> (Value -> Result a) -> (from -> Value) -> TypedSchemaFlex from a
- RecordSchema :: RecordFields from a -> TypedSchemaFlex from a
- type TypedSchema a = TypedSchemaFlex a a
- named :: SchemaName -> TypedSchemaFlex from' a -> TypedSchemaFlex from' a
- enum :: Eq a => (a -> Text) -> NonEmpty a -> TypedSchema a
- stringMap :: TypedSchema a -> TypedSchema (HashMap Text a)
- list :: IsList l => TypedSchema (Item l) -> TypedSchema l
- vector :: TypedSchema a -> TypedSchema (Vector a)
- viaJSON :: (FromJSON a, ToJSON a) => Text -> TypedSchema a
- viaIso :: Iso' a b -> TypedSchema a -> TypedSchema b
- string :: TypedSchema String
- readShow :: (Read a, Show a) => TypedSchema a
- eitherSchema :: TypedSchemaFlex from a -> TypedSchemaFlex from' a' -> TypedSchemaFlex (Either from from') (Either a a')
- emptySchema :: TypedSchema Void
- pureSchema :: a -> TypedSchemaFlex a a
- allOf :: NonEmpty (TypedSchemaFlex from a) -> TypedSchemaFlex from a
- data RecordField from a where
- RequiredAp :: {..} -> RecordField from a
- OptionalAp :: {..} -> RecordField from a
- fieldNameL :: Lens' (RecordField from a) Text
- newtype RecordFields from a = RecordFields {
- getRecordFields :: Alt (RecordField from) a
- overFieldNames :: (Text -> Text) -> RecordFields from a -> RecordFields from a
- record :: RecordFields from a -> TypedSchemaFlex from a
- fieldWith :: TypedSchema a -> Text -> (from -> a) -> RecordFields from a
- fieldWith' :: TypedSchemaFlex from a -> Text -> RecordFields from a
- liftPrism :: Prism s t a b -> TypedSchemaFlex a b -> TypedSchemaFlex t t -> TypedSchemaFlex s t
- liftJust :: TypedSchemaFlex a b -> TypedSchemaFlex (Maybe a) (Maybe b)
- liftRight :: TypedSchemaFlex a b -> TypedSchemaFlex (Either c a) (Either c b)
- optFieldWith :: forall a from. TypedSchemaFlex from (Maybe a) -> Text -> RecordFields from (Maybe a)
- optFieldGeneral :: forall a from. a -> TypedSchemaFlex from a -> Text -> RecordFields from a
- optFieldEitherWith :: TypedSchemaFlex from (Either e a) -> Text -> e -> RecordFields from (Either e a)
- extractFieldsHelper :: Alternative f => (forall a. RecordField from a -> f b) -> RecordFields from a -> f [b]
- data UnionAlt from where
- UnionAlt :: Prism' from b -> TypedSchema b -> UnionAlt from
- altWith :: TypedSchema a -> Prism' from a -> UnionAlt from
- union :: NonEmpty (Text, UnionAlt from) -> TypedSchema from
- oneOf :: NonEmpty (UnionAlt from) -> TypedSchema from
- extractSchema :: TypedSchemaFlex from a -> NonEmpty Schema
- extractFields :: RecordFields from to -> [[(Text, Field)]]
- extractValidators :: TypedSchemaFlex from a -> Validators
- type TracedMismatches = [(Trace, Mismatch)]
- newtype IterAltT m a = IterAlt {
- runIterAlt :: IterT m a
- runDelay :: Monad m => Natural -> IterAltT m a -> m (Maybe a)
- newtype Result a = Result {
- getResult :: IterAltT (Attempt TracedMismatches) a
- liftAttempt :: Attempt TracedMismatches a -> Result a
- runResult :: MonadError TracedMismatches g => Natural -> Result a -> g (Maybe a)
- type Partial = IterT Maybe
- encodeWith :: TypedSchemaFlex from a -> from -> Value
- encodeToWith :: TypedSchemaFlex from a -> Schema -> Either TracedMismatches (from -> Value)
- runSchema :: TypedSchemaFlex enc dec -> enc -> Either [Mismatch] dec
- evalSchema :: forall enc dec. TypedSchemaFlex enc dec -> Maybe dec
- decodeWith :: TypedSchemaFlex from a -> Value -> Result a
- decodeFromWith :: TypedSchemaFlex from a -> Schema -> Result (Value -> Result a)
- runAlt_ :: (Alternative g, Monoid m) => (forall a. f a -> g m) -> Alt f b -> g m
- (<.>) :: Functor f => (b -> c) -> (a -> f b) -> a -> f c
Documentation
data TypedSchemaFlex from a where Source #
TypedSchemaFlex enc dec
is a schema for encoding from enc
and decoding to dec
.
Usually we want enc
and dec
to be the same type but this flexibility comes in handy
for composition.
- introduction forms:
record
,enum
,schema
- operations:
encodeToWith
,decodeFrom
,extractSchema
- composition:
dimap
,union
,stringMap
,liftPrism
TNamed :: SchemaName -> TypedSchemaFlex from' a' -> (a' -> a) -> (from -> from') -> TypedSchemaFlex from a | |
TEnum :: NonEmpty (Text, a) -> (from -> Text) -> TypedSchemaFlex from a | |
TArray :: TypedSchemaFlex b b -> (Vector b -> a) -> (from -> Vector b) -> TypedSchemaFlex from a | |
TMap :: TypedSchemaFlex b b -> (HashMap Text b -> a) -> (from -> HashMap Text b) -> TypedSchemaFlex from a | |
TAllOf :: NonEmpty (TypedSchemaFlex from a) -> TypedSchemaFlex from a | Encoding and decoding support all alternatives |
TOneOf :: TypedSchemaFlex from' a' -> TypedSchemaFlex from'' a'' -> (Either a' a'' -> a) -> (from -> Either from' from'') -> TypedSchemaFlex from a | Decoding from all alternatives, but encoding only to one |
TEmpty :: (Void -> a) -> (from -> Void) -> TypedSchemaFlex from a | |
TPrim :: Text -> (Value -> Result a) -> (from -> Value) -> TypedSchemaFlex from a | |
RecordSchema :: RecordFields from a -> TypedSchemaFlex from a |
Instances
type TypedSchema a = TypedSchemaFlex a a Source #
named :: SchemaName -> TypedSchemaFlex from' a -> TypedSchemaFlex from' a Source #
named n sc
annotates a schema with a name, allowing for circular schemas.
enum :: Eq a => (a -> Text) -> NonEmpty a -> TypedSchema a Source #
enum values mapping
construct a schema for a non empty set of values with a Text
mapping
stringMap :: TypedSchema a -> TypedSchema (HashMap Text a) Source #
stringMap sc
is the schema for a stringmap where the values have schema sc
list :: IsList l => TypedSchema (Item l) -> TypedSchema l Source #
list sc
is the schema for a list of values with schema sc
vector :: TypedSchema a -> TypedSchema (Vector a) Source #
vector sc
is the schema for a vector of values with schema sc
viaJSON :: (FromJSON a, ToJSON a) => Text -> TypedSchema a Source #
viaJson label
constructs a schema reusing existing aeson
instances. The resulting schema
is opaque and cannot be subtyped and/or versioned, so this constructor should be used sparingly.
The label
is used to describe the extracted Schema
.
viaIso :: Iso' a b -> TypedSchema a -> TypedSchema b Source #
Apply an isomorphism to a schema
string :: TypedSchema String Source #
The schema of String values
readShow :: (Read a, Show a) => TypedSchema a Source #
A schema for types that can be parsed and pretty-printed. The resulting schema is opaque and cannot be subtyped/versioned, so this constructor is best used for primitive value
eitherSchema :: TypedSchemaFlex from a -> TypedSchemaFlex from' a' -> TypedSchemaFlex (Either from from') (Either a a') Source #
eitherSchema
and emptySchema
make TypedSchemaFlex
an almost instance of SumProfunctor
(no Choice
)
emptySchema :: TypedSchema Void Source #
The vacuous schema
pureSchema :: a -> TypedSchemaFlex a a Source #
The schema that can be trivially decoded and encoded
allOf :: NonEmpty (TypedSchemaFlex from a) -> TypedSchemaFlex from a Source #
data RecordField from a where Source #
RequiredAp | |
| |
OptionalAp | |
|
Instances
Profunctor RecordField Source # | |
Defined in Schemas.Internal dimap :: (a -> b) -> (c -> d) -> RecordField b c -> RecordField a d # lmap :: (a -> b) -> RecordField b c -> RecordField a c # rmap :: (b -> c) -> RecordField a b -> RecordField a c # (#.) :: Coercible c b => q b c -> RecordField a b -> RecordField a c # (.#) :: Coercible b a => RecordField b c -> q a b -> RecordField a c # |
fieldNameL :: Lens' (RecordField from a) Text Source #
Lens for the fieldName
attribute
newtype RecordFields from a Source #
An Alternative
profunctor for defining record schemas with versioning.
schemaPerson = Person <$> (field "name" name <|> field "full name" name) <*> (field "age" age <|> pure -1)
Alternatives are searched greedily in a top-down order.
RecordFields | |
|
Instances
overFieldNames :: (Text -> Text) -> RecordFields from a -> RecordFields from a Source #
Map a function over all the field names
record :: RecordFields from a -> TypedSchemaFlex from a Source #
Wrap an applicative record schema
fieldWith :: TypedSchema a -> Text -> (from -> a) -> RecordFields from a Source #
fieldWith sc n get
introduces a field
fieldWith' :: TypedSchemaFlex from a -> Text -> RecordFields from a Source #
Generalised version of fieldWith
liftPrism :: Prism s t a b -> TypedSchemaFlex a b -> TypedSchemaFlex t t -> TypedSchemaFlex s t Source #
Project a schema through a Prism.
liftJust :: TypedSchemaFlex a b -> TypedSchemaFlex (Maybe a) (Maybe b) Source #
Returns a partial schema. When encoding/decoding a Nothing value, an optional field will be omitted, and a required field will cause this alternative to be aborted.
liftRight :: TypedSchemaFlex a b -> TypedSchemaFlex (Either c a) (Either c b) Source #
Returns a partial schema. When encoding/decoding a Left value, an optional field will be omitted, and a required field will cause this alternative to be aborted.
optFieldWith :: forall a from. TypedSchemaFlex from (Maybe a) -> Text -> RecordFields from (Maybe a) Source #
optFieldGeneral :: forall a from. a -> TypedSchemaFlex from a -> Text -> RecordFields from a Source #
The most general introduction form for optional alts
optFieldEitherWith :: TypedSchemaFlex from (Either e a) -> Text -> e -> RecordFields from (Either e a) Source #
A generalized version of optFieldEither
.
extractFieldsHelper :: Alternative f => (forall a. RecordField from a -> f b) -> RecordFields from a -> f [b] Source #
data UnionAlt from where Source #
An alternative in a union type
UnionAlt :: Prism' from b -> TypedSchema b -> UnionAlt from |
altWith :: TypedSchema a -> Prism' from a -> UnionAlt from Source #
Declare an alternative in a union type
union :: NonEmpty (Text, UnionAlt from) -> TypedSchema from Source #
Discriminated unions that record the name of the chosen constructor in the schema
data Education = Degree Text | PhD Text | NoEducation schemaEducation = union' [ ("NoEducation", alt #_NoEducation) , ("Degree" , alt #_Degree) , ("PhD" , alt #_PhD) ]
oneOf :: NonEmpty (UnionAlt from) -> TypedSchema from Source #
Undiscriminated union that do not record the name of the constructor in the schema
data Education = Degree Text | PhD Text | NoEducation schemaEducation = oneOf [ alt #_NoEducation , alt #_Degree , alt #_PhD ]
Alternatives are searched greedily in a top-down order.
extractSchema :: TypedSchemaFlex from a -> NonEmpty Schema Source #
Extract an untyped schema that can be serialized.
For schemas with alternatives, this enumerates all the possible versions lazily. Beware when using on schemas with multiple alternatives, as the number of versions is exponential.
extractFields :: RecordFields from to -> [[(Text, Field)]] Source #
Extract all the field groups (from alternatives) in the record
extractValidators :: TypedSchemaFlex from a -> Validators Source #
Returns all the primitive validators embedded in this typed schema
type TracedMismatches = [(Trace, Mismatch)] Source #
IterAlt | |
|
Instances
MonadTrans IterAltT Source # | |
Defined in Schemas.Internal | |
MonadState s m => MonadState s (IterAltT m) Source # | |
Monad m => MonadFree Identity (IterAltT m) Source # | |
MonadError e m => MonadError e (IterAltT m) Source # | |
Defined in Schemas.Internal throwError :: e -> IterAltT m a # catchError :: IterAltT m a -> (e -> IterAltT m a) -> IterAltT m a # | |
Monad m => Monad (IterAltT m) Source # | |
Monad m => Functor (IterAltT m) Source # | |
Monad m => Applicative (IterAltT m) Source # | |
MonadPlus m => Alternative (IterAltT m) Source # | |
(Eq1 m, Eq a) => Eq (IterAltT m a) Source # | |
(Show1 m, Show a) => Show (IterAltT m a) Source # | |
A monad encapsulating failure as well as non-termination
Instances
Monad Result Source # | |
Functor Result Source # | |
Applicative Result Source # | |
Alternative Result Source # | |
MonadFree Identity Result Source # | |
MonadError TracedMismatches Result Source # | |
Defined in Schemas.Internal throwError :: TracedMismatches -> Result a # catchError :: Result a -> (TracedMismatches -> Result a) -> Result a # | |
Eq a => Eq (Result a) Source # | |
Show a => Show (Result a) Source # | |
liftAttempt :: Attempt TracedMismatches a -> Result a Source #
runResult :: MonadError TracedMismatches g => Natural -> Result a -> g (Maybe a) Source #
Run a Result
up with bounded depth. Returns nothing if it runs out of steps.
encodeWith :: TypedSchemaFlex from a -> from -> Value Source #
Given a typed schema, produce a JSON encoder to the first version produced by extractSchema
encodeToWith :: TypedSchemaFlex from a -> Schema -> Either TracedMismatches (from -> Value) Source #
Given source and target schemas, produce a JSON encoder
runSchema :: TypedSchemaFlex enc dec -> enc -> Either [Mismatch] dec Source #
Runs a schema as a function enc -> dec
. Loops for infinite/circular data
evalSchema :: forall enc dec. TypedSchemaFlex enc dec -> Maybe dec Source #
Evaluates a schema as a value of type dec
. Can only succeed if the schema contains a TPure
alternative
decodeWith :: TypedSchemaFlex from a -> Value -> Result a Source #
Given a JSON Value
and a typed schema, extract a Haskell value
decodeFromWith :: TypedSchemaFlex from a -> Schema -> Result (Value -> Result a) Source #