unDhall :: Params -> Config -> MonitorOptions -> RunDhallOptions -> IO ()
runDhall
  params@Params{colour, verbosity}
  Config{}
  monitorOptions@MonitorOptions{notificationMessage}
  RunDhallOptions{arguments, expression} = do
    -- TODO: Handle dhall exceptions properly.  Get inspired by `config`
    -- subcommand.
    mkCommand
        <- fromDhallInput <$> dhallInput (defaultDhallInputParams expression)
    let cmd@Command{command} = mkCommand verbosity colour arguments
        monitorOptions' = monitorOptions
            { notificationMessage =
                notificationMessage <> "'" <> fromString command <> "'"
            }
    executeAndMonitorCommand params monitorOptions' cmd

runDhall :: Params -> Config -> MonitorOptions -> RunDhallOptions -> IO ()
runDhall
  params@Params{colour, verbosity}
  Config{}
  monitorOptions@MonitorOptions{notificationMessage}
  RunDhallOptions{arguments, expression} = do
    -- TODO: Handle dhall exceptions properly.  Get inspired by `config`
    -- subcommand.
    mkCommand
        <- fromDhallInput <$> dhallInput (defaultDhallInputParams expression)
    let cmd@Command{command} = mkCommand verbosity colour arguments
        monitorOptions' = monitorOptions
            { notificationMessage =
                notificationMessage <> "'" <> fromString command <> "'"
            }
    executeAndMonitorCommand params monitorOptions' cmd
runDhall
  params@Params{colour, verbosity}
  Config{}
  monitorOptions@MonitorOptions{notificationMessage}
  RunDhallOptions{arguments, expression} = do
    -- TODO: Handle dhall exceptions properly.  Get inspired by `config`
    -- subcommand.
    mkCommand
        <- fromDhallInput <$> dhallInput (defaultDhallInputParams expression)
    let cmd@Command{command} = mkCommand verbosity colour arguments
        monitorOptions' = monitorOptions
            { notificationMessage =
                notificationMessage <> "'" <> fromString command <> "'"
            }
    executeAndMonitorCommand params monitorOptions' cmd