hablo/src/JSON.hs

52 lines
1.3 KiB
Haskell
Raw Normal View History

2019-02-04 18:30:23 +01:00
{-# LANGUAGE DeriveGeneric #-}
2019-01-27 21:41:21 +01:00
module JSON (
generate
) where
2019-02-04 18:30:23 +01:00
import Article (Article)
import qualified Article (Article(..))
import Blog (Blog)
import qualified Blog (Blog(..), get)
2019-01-27 21:41:21 +01:00
import Control.Monad.IO.Class (MonadIO(..))
2019-02-04 18:30:23 +01:00
import Control.Monad.Reader (ReaderT)
import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode)
2019-01-27 21:41:21 +01:00
import Data.ByteString.Lazy (writeFile)
2019-02-04 18:30:23 +01:00
import qualified Data.Map as Map (elems)
import System.FilePath.Posix ((</>), (<.>))
2019-01-27 21:41:21 +01:00
import Prelude hiding (writeFile)
2019-02-04 18:30:23 +01:00
import GHC.Generics
data ArticleExport = ArticleExport {
source :: String
, title :: String
} deriving (Generic)
instance ToJSON ArticleExport where
toEncoding = genericToEncoding defaultOptions
data BlogDB = BlogDB {
articles :: [ArticleExport]
} deriving (Generic)
instance ToJSON BlogDB where
toEncoding = genericToEncoding defaultOptions
export :: Article -> ArticleExport
export article = ArticleExport {
source = "/" </> Article.urlPath article <.> "md"
, title = Article.title article
}
exportBlog :: ReaderT Blog IO BlogDB
exportBlog = do
allArticles <- Blog.get Blog.articles
return $ BlogDB {
articles = export <$> Map.elems allArticles
}
2019-01-27 21:41:21 +01:00
generate :: ReaderT Blog IO ()
generate = do
2019-02-04 18:30:23 +01:00
path <- Blog.get Blog.root
jsonContent <- exportBlog
liftIO $ writeFile (path </> "articles.json") (encode jsonContent)