hablo/src/JSON.hs

52 lines
1.3 KiB
Haskell

{-# LANGUAGE DeriveGeneric #-}
module JSON (
generate
) where
import Article (Article)
import qualified Article (Article(..))
import Blog (Blog)
import qualified Blog (Blog(..), get)
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Reader (ReaderT)
import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode)
import Data.ByteString.Lazy (writeFile)
import qualified Data.Map as Map (elems)
import System.FilePath.Posix ((</>), (<.>))
import Prelude hiding (writeFile)
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
}
generate :: ReaderT Blog IO ()
generate = do
path <- Blog.get Blog.root
jsonContent <- exportBlog
liftIO $ writeFile (path </> "articles.json") (encode jsonContent)