packages feed

helic-0.3.0.0: lib/Helic/Interpreter/InstanceName.hs

-- |Reader Interpreter for InstanceName, Internal
module Helic.Interpreter.InstanceName where

import Network.HostName (getHostName)
import qualified Polysemy.Error as Polysemy

import Helic.Data.InstanceName (InstanceName (InstanceName))

-- |If no instance name was given in the config file, query the system's host name.
determineName ::
  Members [Error Text, Embed IO] r =>
  Maybe Text ->
  Sem r InstanceName
determineName = \case
  Just name ->
    pure (InstanceName name)
  _ ->
    Polysemy.fromExceptionVia err (fromString <$> getHostName)
  where
    err (e :: SomeException) =
      [exon|no name in conig and unable to determine hostname: #{show e}|]

-- |Interpret @'Reader' 'InstanceName'@ using the name specified in the config file, falling back to the system's host
-- name if it wasn't given.
interpretInstanceName ::
  Members [Error Text, Embed IO] r =>
  Maybe Text ->
  InterpreterFor (Reader InstanceName) r
interpretInstanceName configName sem = do
  name <- determineName configName
  runReader name sem