module Argo.QuasiQuoter where

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

pointer :: TH.QuasiQuoter
pointer :: QuasiQuoter
pointer = QuasiQuoter
defaultQuasiQuoter
    { quoteExp :: String -> Q Exp
TH.quoteExp =
        (String -> Q Exp)
-> (Pointer -> Q Exp) -> Either String Pointer -> Q Exp
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail Pointer -> Q Exp
forall t. Lift t => t -> Q Exp
TH.lift
        (Either String Pointer -> Q Exp)
-> (String -> Either String Pointer) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String Pointer
Decode.decodePointer
        (ByteString -> Either String Pointer)
-> (String -> ByteString) -> String -> Either String 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
    }

schema :: TH.QuasiQuoter
schema :: QuasiQuoter
schema = QuasiQuoter
defaultQuasiQuoter
    { quoteExp :: String -> Q Exp
TH.quoteExp =
        (String -> Q Exp)
-> (Value -> Q Exp) -> Either String Value -> Q Exp
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (Schema -> Q Exp
forall t. Lift t => t -> Q Exp
TH.lift (Schema -> Q Exp) -> (Value -> Schema) -> Value -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Schema
Schema.fromValue)
        (Either String Value -> Q Exp)
-> (String -> Either String Value) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String Value
forall a. HasCodec a => ByteString -> Either String a
Decode.decode
        (ByteString -> Either String Value)
-> (String -> ByteString) -> String -> Either String 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
    }

value :: TH.QuasiQuoter
value :: QuasiQuoter
value = QuasiQuoter
defaultQuasiQuoter
    { quoteExp :: String -> Q Exp
TH.quoteExp =
        (String -> Q Exp)
-> (Value -> Q Exp) -> Either String Value -> Q Exp
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (Value -> Q Exp
forall t. Lift t => t -> Q Exp
TH.lift (Value -> Q Exp) -> (Value -> Value) -> Value -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Value
asValue)
        (Either String Value -> Q Exp)
-> (String -> Either String Value) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String Value
forall a. HasCodec a => ByteString -> Either String a
Decode.decode
        (ByteString -> Either String Value)
-> (String -> ByteString) -> String -> Either String 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
    }

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

defaultQuasiQuoter :: TH.QuasiQuoter
defaultQuasiQuoter :: QuasiQuoter
defaultQuasiQuoter = 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 = Q Exp -> String -> Q Exp
forall a b. a -> b -> a
const (Q Exp -> String -> Q Exp) -> Q Exp -> String -> Q Exp
forall a b. (a -> b) -> a -> b
$ String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"cannot be used as an expression"
    , 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"
    }