module Argo.Internal.Decode where

import qualified Argo.Internal.Class.HasCodec as HasCodec
import qualified Argo.Internal.Codec.Value as Codec
import qualified Argo.Internal.Json.Value as Value
import qualified Argo.Internal.Pointer.Pointer as Pointer
import qualified Argo.Internal.Type.Decoder as Decoder
import qualified Argo.Vendor.ByteString as ByteString

decode :: HasCodec.HasCodec a => ByteString.ByteString -> Either String a
decode :: forall a. HasCodec a => ByteString -> Either String a
decode ByteString
x = do
    Value
y <- forall a. Decoder a -> ByteString -> Either String a
Decoder.run (Decoder ()
Decoder.spaces forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> StateT ByteString (ExceptT String Identity) Value
Value.decode) ByteString
x
    forall a. HasCodec a => Value -> Either String a
fromValue Value
y

decodePointer :: ByteString.ByteString -> Either String Pointer.Pointer
decodePointer :: ByteString -> Either String Pointer
decodePointer = forall a. Decoder a -> ByteString -> Either String a
Decoder.run Decoder Pointer
Pointer.decode

fromValue :: HasCodec.HasCodec a => Value.Value -> Either String a
fromValue :: forall a. HasCodec a => Value -> Either String a
fromValue = forall a. Value a -> Value -> Either String a
Codec.decodeWith forall a. HasCodec a => Value a
HasCodec.codec