packages feed

servant-to-elm-0.4.3.0: test/TestExampleServer.hs

{-# language AllowAmbiguousTypes #-}
{-# language DataKinds #-}
{-# language DeriveAnyClass #-}
{-# language DeriveGeneric #-}
{-# language FlexibleContexts #-}
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language OverloadedStrings #-}
{-# language PolyKinds #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# language TypeOperators #-}
module TestExampleServer where

import qualified Data.Aeson as Aeson
import Data.HashMap.Strict (HashMap)
import Data.Text (Text)
import GHC.Generics
import qualified Generics.SOP as SOP
import qualified Language.Elm.Definition as Elm (Definition)
import qualified Language.Elm.Pretty as Pretty
import qualified Language.Elm.Simplification as Simplification
import qualified Prettyprinter
import Servant.API
import Servant.To.Elm

import Language.Haskell.To.Elm

data User = User
  { name :: Text
  , age :: Int
  } deriving (Generic, Aeson.ToJSON, SOP.Generic, SOP.HasDatatypeInfo)

instance HasElmType User where
  elmDefinition =
    Just $ deriveElmTypeDefinition @User defaultOptions "Api.User.User"

instance HasElmDecoder Aeson.Value User where
  elmDecoderDefinition =
    Just $ deriveElmJSONDecoder @User defaultOptions Aeson.defaultOptions "Api.User.decoder"

instance HasElmEncoder Aeson.Value User where
  elmEncoderDefinition =
    Just $ deriveElmJSONEncoder @User defaultOptions Aeson.defaultOptions "Api.User.encoder"

type UserAPI
  = "user" :> Get '[JSON] User
  :<|> "user" :> ReqBody '[JSON] User :> PostNoContent

definitionModules :: HashMap [Text] (Prettyprinter.Doc ann)
definitionModules =
  Pretty.modules (Simplification.simplifyDefinition <$> definitions)
  where
    definitions :: [Elm.Definition]
    definitions =
      map (elmEndpointDefinition "Config.urlBase" ["Api"]) (elmEndpoints @UserAPI)
        <> jsonDefinitions @User

requestInfoModules :: HashMap [Text] (Prettyprinter.Doc ann)
requestInfoModules =
  Pretty.modules (Simplification.simplifyDefinition <$> definitions)
  where
    definitions :: [Elm.Definition]
    definitions =
      map (elmEndpointRequestInfo ["Api"]) (elmEndpoints @UserAPI)
        <> jsonDefinitions @User