diff --git a/src/JSON.hs b/src/JSON.hs index f98d3cf..8350e28 100644 --- a/src/JSON.hs +++ b/src/JSON.hs @@ -1,16 +1,51 @@ +{-# LANGUAGE DeriveGeneric #-} module JSON ( generate ) where -import Blog (Blog(..)) +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 (MonadReader(..), ReaderT) -import Data.Aeson +import Control.Monad.Reader (ReaderT) +import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode) import Data.ByteString.Lazy (writeFile) -import System.FilePath.Posix (()) +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 <- root <$> ask - liftIO $ writeFile (path "articles.json") (encode $ object []) + path <- Blog.get Blog.root + jsonContent <- exportBlog + liftIO $ writeFile (path "articles.json") (encode jsonContent)