{- |
Module                  : DrCabal.Json
Copyright               : (c) 2022 Dmitrii Kovanikov
SPDX-License-Identifier : MPL-2.0
Maintainer              : Dmitrii Kovanikov <kovanikov@gmail.com>
Stability               : Experimental
Portability             : Portable

This module contains functions to process JSON entries recognised by @dr-cabal@.
-}

module DrCabal.Json
    ( readEntries
    , writeEntries
    ) where

import Data.Aeson (eitherDecodeFileStrict')
import Data.Aeson.Encode.Pretty (encodePretty)

import DrCabal.Model (Entry)

import qualified Colourista


{- | Read a list of entries from a JSON file.

Exits process with an error message on decoding failure.
-}
readEntries :: FilePath -> IO [Entry]
readEntries :: FilePath -> IO [Entry]
readEntries FilePath
file = forall a. FromJSON a => FilePath -> IO (Either FilePath a)
eitherDecodeFileStrict' FilePath
file forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Right [Entry]
entries -> forall (f :: * -> *) a. Applicative f => a -> f a
pure [Entry]
entries
    Left FilePath
err -> do
        Text -> IO ()
Colourista.errorMessage forall a b. (a -> b) -> a -> b
$ Text
"Error parsing file: " forall a. Semigroup a => a -> a -> a
<> forall a. ToText a => a -> Text
toText FilePath
file
        Text -> IO ()
Colourista.redMessage   forall a b. (a -> b) -> a -> b
$ Text
"      " forall a. Semigroup a => a -> a -> a
<> forall a. ToText a => a -> Text
toText FilePath
err
        forall (m :: * -> *) a. MonadIO m => m a
exitFailure

-- | Write entries as a pretty JSON to the output file.
writeEntries :: FilePath -> [Entry] -> IO ()
writeEntries :: FilePath -> [Entry] -> IO ()
writeEntries FilePath
outputPath = forall (m :: * -> *). MonadIO m => FilePath -> LByteString -> m ()
writeFileLBS FilePath
outputPath forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> LByteString
encodePretty