ruby-marshal-0.1.1: src/Data/Ruby/Marshal.hs
--------------------------------------------------------------------
-- |
-- Module : Data.Ruby.Marshal
-- Copyright : (c) Philip Cunningham, 2015
-- License : MIT
--
-- Maintainer: hello@filib.io
-- Stability : experimental
-- Portability: portable
--
-- Simple interface to parse Ruby Marshal binary.
--
--------------------------------------------------------------------
module Data.Ruby.Marshal (
-- * Decoding
decode
, decodeEither
-- * Lifting into and lowering from RubyObject
, fromRuby
, toRuby
-- * Re-exported modules
, module Data.Ruby.Marshal.Types
) where
import Control.Monad.State.Strict (evalStateT)
import qualified Data.ByteString as BS
import Data.Ruby.Marshal.Get
import Data.Ruby.Marshal.Monad (emptyCache, runMarshal)
import Data.Ruby.Marshal.RubyObject
import Data.Ruby.Marshal.Types
import Data.Serialize (runGet)
-- | Parses a subset of Ruby objects serialised with Marshal, Ruby's
-- built-in binary serialisation format.
decode :: BS.ByteString
-- ^ Serialised Ruby object
-> Maybe RubyObject
-- ^ De-serialisation result
decode = hush . decodeEither
-- | Parses a subset of Ruby objects serialised with Marshal, Ruby's
-- built-in binary serialisation format.
decodeEither :: BS.ByteString
-- ^ Serialised Ruby object
-> Either String RubyObject
-- ^ Error message or de-serialisation result
decodeEither = runGet (evalStateT (runMarshal getRubyObject) emptyCache)
-- | Converts an Either to a Maybe.
hush :: Either a b -> Maybe b
hush = either (const Nothing) Just