---
tags:
  - Haskell
  - Code
title: "Webapp-Example: MyService/Types.hs"
categories:
  - Haskell
  - Code
date: 2020-04-01
---

Anleitung siehe [Webapp-Example](index.qmd).

```haskell
{-# OPTIONS_GHC -Wno-orphans #-}
{-# OPTIONS_GHC -Wno-name-shadowing #-}
{-# LANGUAGE DeriveAnyClass        #-}
{-# LANGUAGE DeriveFunctor         #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DerivingVia           #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE LambdaCase            #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE RankNTypes            #-}
{-# LANGUAGE RecordWildCards       #-}
module MyService.Types where

import           Data.Aeson                     (FromJSON, ToJSON)
import           Data.Text
import           Data.Time.Clock
import           GHC.Generics
import           System.Envy
import           Text.PrettyPrint               (text)
import           Text.PrettyPrint.GenericPretty

-- Out hat hierfür keine Instanzen, daher kurz eine einfach Definition.
instance Out Text where
  doc = text . unpack
  docPrec i a = text $ showsPrec i a ""

instance Out UTCTime where
  doc = text . show
  docPrec i a = text $ showsPrec i a ""

-- Der ServerConfig-Typ. Wird mit den defaults unten initialisiert, dann mit den Variablen aus der .env-Datei überschrieben und zum Schluss können Serveradmins diese via $MYSERVICE_FOO nochmal überschreiben.
data ServerConfig = ServerConfig
                  { myserviceHost              :: String -- ^ Environment: $MYSERVICE_HOST
                  , myservicePort              :: Int    -- ^ Environment: $MYSERVICE_PORT
                  , myserviceMaxTimeout        :: Int    -- ^ Environment: $MYSERVICE_MAX_TIMEOUT
                  , myserviceInternalProxyUrl  :: String -- ^ Environment: $MYSERVICE_INTERNAL_PROXY_URL
                  , myserviceInternalProxyPort :: Int    -- ^ Environment: $MYSERVICE_INTERNAL_PROXY_PORT
                  , myserviceExternalProxyUrl  :: String -- ^ Environment: $MYSERVICE_EXTERNAL_PROXY_URL
                  , myserviceExternalProxyPort :: Int    -- ^ Environment: $MYSERVICE_EXTERNAL_PROXY_PORT
                  , myserviceActivemqHost      :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_HOST
                  , myserviceActivemqPort      :: Int    -- ^ Environment: $MYSERVICE_ACTIVEMQ_PORT
                  , myserviceActivemqUsername  :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_USERNAME
                  , myserviceActivemqPassword  :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_PASSWORD
                  , myserviceMongoUsername     :: String -- ^ Environment: $MYSERVICE_MONGO_USERNAME
                  , myserviceMongoPassword     :: String -- ^ Environment: $MYSERVICE_MONGO_PASSWORD
                  , myserviceDebug             :: Bool   -- ^ Environment: $MYSERVICE_DEBUG
                  } deriving (Show, Eq, Generic)

-- Default-Konfigurations-Instanz für diesen Service.
instance DefConfig ServerConfig where
  defConfig = ServerConfig "0.0.0.0" 8080 20
                           ""
                           ""
                           ""
                           0
                           ""
                           0
                           ""
                           0
                           ""
                           ""
                           ""
                           ""
                           False

-- Kann auch aus dem ENV gefüllt werden
instance FromEnv ServerConfig
-- Und hübsch ausgegeben werden.
instance Out ServerConfig


instance Out Response
instance FromBSON Repsonse -- FromBSON-Instanz geht immer davon aus, dass alle keys da sind (ggf. mit null bei Nothing).
```
