etc-0.4.1.0: src/System/Etc/Internal/Spec/JSON.hs
{-# LANGUAGE NoImplicitPrelude #-}
module System.Etc.Internal.Spec.JSON where
import qualified Data.Text.IO as Text (readFile)
import RIO
import qualified RIO.ByteString.Lazy as LBS
import qualified RIO.Text as Text
import qualified Data.Aeson as JSON
import System.Etc.Internal.Errors
import System.Etc.Internal.Spec.Parser ()
import System.Etc.Internal.Spec.Types
parseConfigSpec_
:: (MonadThrow m, JSON.FromJSON cmd) => Maybe Text -> Text -> m (ConfigSpec cmd)
parseConfigSpec_ mFilePath input =
case JSON.eitherDecode (LBS.fromStrict $ encodeUtf8 input) of
Left err -> throwM $ SpecInvalidSyntaxFound mFilePath (Text.pack err)
Right result -> return result
parseConfigSpec :: (MonadThrow m, JSON.FromJSON cmd) => Text -> m (ConfigSpec cmd)
parseConfigSpec = parseConfigSpec_ Nothing
readConfigSpec :: JSON.FromJSON cmd => Text -> IO (ConfigSpec cmd)
readConfigSpec filepath = do
contents <- Text.readFile (Text.unpack filepath)
parseConfigSpec_ (Just filepath) contents