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 :: ByteString -> Either String a
decode ByteString
x = do
    Value
y <- Decoder Value -> ByteString -> Either String Value
forall a. Decoder a -> ByteString -> Either String a
Decoder.run (Decoder ()
Decoder.spaces Decoder () -> Decoder Value -> Decoder Value
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Decoder Value
Value.decode) ByteString
x
    Value -> Either String a
forall a. HasCodec a => Value -> Either String a
fromValue Value
y

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

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