{- Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. This source code is licensed under the BSD-style license found in the LICENSE file in the root directory of this source tree. -} module Thrift.Util ( loadJSON , saveJSON , ThriftException(..) , prettyThrift ) where import Control.Exception import Data.Aeson import Data.Aeson.Encode.Pretty import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy.Char8 as LB import Thrift.Protocol import Thrift.Protocol.JSON newtype ThriftException = ThriftException String deriving Show instance Exception ThriftException -- | Load a Thrift value from a file using the PrettyJSON protocol loadJSON :: ThriftSerializable a => FilePath -> IO a loadJSON path = do result <- deserializeJSON <$> BS.readFile path case result of Left err -> throwIO $ ThriftException $ "[" ++ path ++ "] " ++ err Right struct -> return struct -- | Save a Thrift value to a file using the PrettyJSON protocol saveJSON :: ThriftSerializable a => FilePath -> a -> IO () saveJSON path value = BS.writeFile path $ serializePrettyJSON value -- | Render a Thrift value as prettified JSON prettyThrift :: ThriftSerializable a => a -> LB.ByteString prettyThrift a = case eitherDecode (LB.fromStrict (serializeJSON a)) of Right obj -> encodePretty (obj :: Object) Left err -> LB.pack err