hablo/src/JSON.hs

78 lines
2.3 KiB
Haskell
Raw Normal View History

2019-02-04 18:30:23 +01:00
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NamedFieldPuns #-}
2019-01-27 21:41:21 +01:00
module JSON (
exportBlog
2019-01-27 21:41:21 +01:00
) where
2019-02-04 18:30:23 +01:00
import Article (Article)
import qualified Article (Article(..))
import Blog (Blog)
import qualified Blog (Blog(..), Path(..), Skin(..))
import Control.Monad.Reader (ReaderT, ask)
2019-02-04 18:30:23 +01:00
import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode)
import Data.ByteString.Lazy (ByteString)
import Data.Map (Map, mapWithKey)
import qualified Data.Map as Map (filter, keys)
import qualified Data.Set as Set (elems, member)
2019-02-04 18:30:23 +01:00
import GHC.Generics
data ArticleExport = ArticleExport {
title :: String
, bodyOffset :: Int
2019-02-15 14:13:43 +01:00
, metadata :: Map String String
, tagged :: [String]
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON ArticleExport where
toEncoding = genericToEncoding defaultOptions
data PathExport = PathExport {
articlesPath :: FilePath
, pagesPath :: Maybe FilePath
} deriving (Generic)
instance ToJSON PathExport where
toEncoding = genericToEncoding defaultOptions
2019-02-15 14:13:43 +01:00
data SkinExport = SkinExport {
previewArticlesCount :: Int
, previewLinesCount :: Int
} deriving (Generic)
instance ToJSON SkinExport where
toEncoding = genericToEncoding defaultOptions
2019-02-04 18:30:23 +01:00
data BlogDB = BlogDB {
articles :: Map String ArticleExport
, path :: PathExport
2019-02-15 14:13:43 +01:00
, skin :: SkinExport
, tags :: Map String [String]
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON BlogDB where
toEncoding = genericToEncoding defaultOptions
export :: Blog -> String -> Article -> ArticleExport
export blog key article = ArticleExport {
title = Article.title article
, bodyOffset = Article.bodyOffset article
2019-02-15 14:13:43 +01:00
, metadata = Article.metadata article
, tagged = Map.keys . Map.filter (Set.member key) $ Blog.tags blog
2019-02-04 18:30:23 +01:00
}
exportBlog :: ReaderT Blog IO ByteString
2019-02-04 18:30:23 +01:00
exportBlog = do
blog <- ask
return . encode $ BlogDB {
articles = mapWithKey (export blog) $ Blog.articles blog
, path = PathExport {
articlesPath = Blog.articlesPath $ Blog.path blog
, pagesPath = Blog.pagesPath $ Blog.path blog
}
2019-02-15 14:13:43 +01:00
, skin = SkinExport {
previewArticlesCount = Blog.previewArticlesCount $ Blog.skin blog
, previewLinesCount = Blog.previewLinesCount $ Blog.skin blog
}
, tags = Set.elems <$> Blog.tags blog
2019-02-04 18:30:23 +01:00
}