module Argo.QuasiQuoter where

import qualified Argo.Decode as Decode
import qualified Argo.Json.Value as Value
import qualified Argo.Result as Result
import qualified Argo.Vendor.TemplateHaskell as TH
import qualified Argo.Vendor.Text as Text

pointer :: TH.QuasiQuoter
pointer :: QuasiQuoter
pointer = QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
TH.QuasiQuoter
    { quoteDec :: String -> Q [Dec]
TH.quoteDec = Q [Dec] -> String -> Q [Dec]
forall a b. a -> b -> a
const (Q [Dec] -> String -> Q [Dec]) -> Q [Dec] -> String -> Q [Dec]
forall a b. (a -> b) -> a -> b
$ String -> Q [Dec]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a declaration"
    , quoteExp :: String -> Q Exp
TH.quoteExp = (String -> Q Exp) -> (Pointer -> Q Exp) -> Result Pointer -> Q Exp
forall b a. (String -> b) -> (a -> b) -> Result a -> b
Result.result String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail Pointer -> Q Exp
forall t. Lift t => t -> Q Exp
TH.lift (Result Pointer -> Q Exp)
-> (String -> Result Pointer) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Result Pointer
Decode.decodePointer (ByteString -> Result Pointer)
-> (String -> ByteString) -> String -> Result Pointer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
Text.encodeUtf8 (Text -> ByteString) -> (String -> Text) -> String -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack
    , quotePat :: String -> Q Pat
TH.quotePat = Q Pat -> String -> Q Pat
forall a b. a -> b -> a
const (Q Pat -> String -> Q Pat) -> Q Pat -> String -> Q Pat
forall a b. (a -> b) -> a -> b
$ String -> Q Pat
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a pattern"
    , quoteType :: String -> Q Type
TH.quoteType = Q Type -> String -> Q Type
forall a b. a -> b -> a
const (Q Type -> String -> Q Type) -> Q Type -> String -> Q Type
forall a b. (a -> b) -> a -> b
$ String -> Q Type
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a type"
    }

value :: TH.QuasiQuoter
value :: QuasiQuoter
value = QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
TH.QuasiQuoter
    { quoteDec :: String -> Q [Dec]
TH.quoteDec = Q [Dec] -> String -> Q [Dec]
forall a b. a -> b -> a
const (Q [Dec] -> String -> Q [Dec]) -> Q [Dec] -> String -> Q [Dec]
forall a b. (a -> b) -> a -> b
$ String -> Q [Dec]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a declaration"
    , quoteExp :: String -> Q Exp
TH.quoteExp = (String -> Q Exp) -> (Value -> Q Exp) -> Result Value -> Q Exp
forall b a. (String -> b) -> (a -> b) -> Result a -> b
Result.result String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail Value -> Q Exp
forall t. Lift t => t -> Q Exp
TH.lift (Result Value -> Q Exp)
-> (String -> Result Value) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Value) -> Result Value -> Result Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Value -> Value
asValue (Result Value -> Result Value)
-> (String -> Result Value) -> String -> Result Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Result Value
forall a. FromValue a => ByteString -> Result a
Decode.decode (ByteString -> Result Value)
-> (String -> ByteString) -> String -> Result Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
Text.encodeUtf8 (Text -> ByteString) -> (String -> Text) -> String -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack
    , quotePat :: String -> Q Pat
TH.quotePat = Q Pat -> String -> Q Pat
forall a b. a -> b -> a
const (Q Pat -> String -> Q Pat) -> Q Pat -> String -> Q Pat
forall a b. (a -> b) -> a -> b
$ String -> Q Pat
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a pattern"
    , quoteType :: String -> Q Type
TH.quoteType = Q Type -> String -> Q Type
forall a b. a -> b -> a
const (Q Type -> String -> Q Type) -> Q Type -> String -> Q Type
forall a b. (a -> b) -> a -> b
$ String -> Q Type
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as a type"
    }

asValue :: Value.Value -> Value.Value
asValue :: Value -> Value
asValue = Value -> Value
forall a. a -> a
id