content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE PartialTypeSignatures #-}
  {-# OPTIONS_GHC -fno-warn-partial-type-signatures #-}
  
  module Test.Tutorial.Exercise6 where
  
  import Data.Registry
  import Protolude
  import System.Directory (doesFileExist)
  import Test.Tutorial.Application
  
  newCheckedSecretReader :: MonadIO m => SecretReaderConfig -> Logger IO -> Tag "unchecked" (SecretReader IO) -> m (SecretReader IO)
  newCheckedSecretReader (SecretReaderConfig path) logger uncheckedReader = liftIO $ do
    exists <- doesFileExist (toS path)
    unless exists fileDoesNotExist
    pure $ unTag uncheckedReader
    where
      fileDoesNotExist = error logger ("file does not exist at " <> path)
  
  registryIO :: Registry _ _
  registryIO =
    funTo @IO App
      <: funTo @IO newUserInput
      <: funTo @IO (newCheckedSecretReader @IO)
      <: funTo @IO (tag @"unchecked" newSecretReader)
      <: funTo @IO newRng
      <: funTo @IO newLogger
      <: funTo @IO newConsole
      <: valTo @IO (SecretReaderConfig "test/Test/Tutorial/secret.txt")
  
  newAppIO :: IO App
  newAppIO = make @(IO App) registryIO
  