packages feed

heddit-0.0.1: io-tests/Profile.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeApplications #-}

module Profile ( loadProfile, TestProfile(TestProfile) ) where

import           Data.Aeson         ( FromJSON(parseJSON)
                                    , defaultOptions
                                    , eitherDecodeFileStrict
                                    , genericParseJSON
                                    )

import           GHC.Generics       ( Generic )

import           Network.Reddit

import           UnliftIO
import           UnliftIO.Directory

-- | Info on the authenticated user you are running the tests as
data TestProfile = TestProfile
    { username  :: Username
    , userID    :: UserID
      -- | You must be a moderator on this subreddit
    , subreddit :: SubredditName
    }
    deriving stock ( Show, Eq, Generic )

instance FromJSON TestProfile where
    parseJSON = genericParseJSON defaultOptions

-- | Load the test profile from disk
loadProfile :: MonadUnliftIO m => m TestProfile
loadProfile = do
    cwd <- getCurrentDirectory
    cfgDir <- getXdgDirectory XdgConfig "heddit"
    findFile [ cwd, cfgDir ] "profile.json" >>= \case
        Nothing -> throwIO . userError
            $ mconcat [ "No profile.json found for running tests"
                      , " , please create on in $PWD"
                      , " or $XDG_CONFIG_HOME/heddit"
                      ]
        Just f  -> either (throwIO . userError) pure
            =<< liftIO (eitherDecodeFileStrict @TestProfile f)