{-# LANGUAGE LambdaCase #-}
module Data.Aeson.Schema.Show
( SchemaType(..)
, showSchemaType
) where
import Data.List (intercalate)
import Data.Aeson.Schema.Key (SchemaKeyV, showSchemaKeyV)
data SchemaType
= SchemaScalar String
| SchemaMaybe SchemaType
| SchemaTry SchemaType
| SchemaList SchemaType
| SchemaObject [(SchemaKeyV, SchemaType)]
| SchemaUnion [SchemaType]
deriving (Show,Eq)
showSchemaType :: SchemaType -> String
showSchemaType schema = case schema of
SchemaScalar s -> "SchemaScalar " ++ s
SchemaMaybe inner -> "SchemaMaybe " ++ showSchemaType' inner
SchemaTry inner -> "SchemaTry " ++ showSchemaType' inner
SchemaList inner -> "SchemaList " ++ showSchemaType' inner
SchemaUnion _ -> "SchemaUnion " ++ showSchemaType' schema
SchemaObject _ -> "SchemaObject " ++ showSchemaType' schema
where
showSchemaType' = \case
SchemaScalar s -> s
SchemaMaybe inner -> "Maybe " ++ showSchemaType' inner
SchemaTry inner -> "Try " ++ showSchemaType' inner
SchemaList inner -> "List " ++ showSchemaType' inner
SchemaUnion schemas -> "( " ++ mapJoin showSchemaType' " | " schemas ++ " )"
SchemaObject pairs -> "{ " ++ mapJoin showPair ", " pairs ++ " }"
showPair (key, inner) = showSchemaKeyV key ++ ": " ++ showSchemaType' inner
mapJoin f delim = intercalate delim . map f