packages feed

schema-0.0.3: src/Data/Schema/Pretty.hs

module Data.Schema.Pretty (ppSchema) where

import           Data.Fix                     (foldFix)
import           Data.Schema                  (Schema, SchemaF (..))
import           Prelude                      hiding ((<$>))
import           Text.PrettyPrint.ANSI.Leijen

ppSchema :: Schema -> Doc
ppSchema = (<> line) . foldFix go

go :: SchemaF Doc -> Doc
go (Atom ty)                 = text $ show ty
go (Field name ty)           = text name <+> text "::" <+> ty
go (List ty)                 = text "repeated" <+> ty
go (Con name ty)             = text name <+> equals <+> ty
go (Prod fields)             = braces (line <> indent 2 (vcat fields) <> line)
go (Sum Nothing cons)        = vcat cons
go (Sum (Just (m, ty)) cons) =
    text ("type " <> m <> "." <> ty) <+> braces (
        line <> indent 2 (vcat cons)
        <> line)
go (Module name ss)          = text "module" <+> text name <$> vcat ss
go (Schema mods)             = text "schema 1.0;" <$> line <> vcat (punctuate line mods)
go Empty                     = text "<empty>"