packages feed

servant-to-elm-0.1.0.0: examples/UserAPI.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module UserAPI where

import Protolude

import qualified Data.Aeson as Aeson
import qualified Data.HashMap.Lazy as HashMap
import qualified Generics.SOP as SOP
import Servant.API

import qualified Language.Elm.Pretty as Pretty
import Language.Haskell.To.Elm
import Servant.To.Elm

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

instance HasElmDefinition User where
  elmDefinition =
    deriveElmTypeDefinition @User defaultOptions "Api.User.User"

instance HasElmDecoderDefinition Aeson.Value User where
  elmDecoderDefinition =
    deriveElmJSONDecoder @User defaultOptions Aeson.defaultOptions "Api.User.decoder"

instance HasElmEncoderDefinition Aeson.Value User where
  elmEncoderDefinition =
    deriveElmJSONEncoder @User defaultOptions Aeson.defaultOptions "Api.User.encoder"

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

main :: IO ()
main = do
  let
    definitions =
      map (elmEndpointDefinition "Config.urlBase" ["Api"]) (elmEndpoints @UserAPI)
      <> jsonDefinitions @User

    modules =
      Pretty.modules definitions

  forM_ (HashMap.toList modules) $ \(_moduleName, contents) ->
    print contents