slick-1.0.1.1: src/Slick/Utils.hs
{-|
Module : Slick.Utils
Description : Slick helper utilities
Copyright : (c) Chris Penner, 2019
License : BSD3
-}
module Slick.Utils
( getDirectoryPaths
, convert
) where
import Data.Aeson as A
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
A.Success r -> pure r
A.Error err -> fail $ "json conversion error:" ++ err