{-|
Module      : Slick.Utils
Description : Slick helper utilities
Copyright   : (c) Chris Penner, 2019
License     : BSD3
-}
module Slick.Utils
  ( getDirectoryPaths
  , convert
  ) where

import Data.Aeson
import Development.Shake
import Development.Shake.FilePath

------------------------------------------------------------------------------
-- Helper functions

-- | Given a list of extensions and directories,
--   find all files that match, and return full paths.
getDirectoryPaths :: [FilePath]         -- ^ file pattern like *.md
                  -> [FilePath]         -- ^ directories to look at
                  -> Action [FilePath]
getDirectoryPaths extensions dirs =
  concat <$> mapM getPaths dirs
    where
      getPaths :: FilePath -> Action [FilePath]
      getPaths dir =
        fmap (dir </>) <$>
          getDirectoryFiles dir extensions

-- | Attempt to convert between two JSON serializable objects (or 'Value's).
--   Failure to deserialize fails the Shake build.
convert :: (FromJSON a, ToJSON a, FromJSON b) => a -> Action b
convert a = case fromJSON (toJSON a) of
  Success r   -> pure r
  Error   err -> fail $ "json conversion error:" ++ err