{-# LANGUAGE CPP #-}
{-# LANGUAGE JavaScriptFFI #-}
module GHCJS.Fetch.FFI
  ( js_newRequest
  , js_await
  , js_fetch
  , js_responseJSON
  , js_responseText
  , js_newHeaders
  , js_appendHeader
  ) where

import GHC.Stack
import GHCJS.Fetch.Types
import GHCJS.Types
import JavaScript.Object

#ifdef ghcjs_HOST_OS
foreign import javascript safe "new Request($1, $2)" js_newRequest
               :: JSString -> JSVal -> IO JSRequest

foreign import javascript interruptible
               "$1.then(function(a) { $c({ 'val': a, 'success': true }); }, function(e) { $c({ 'val': e, 'success': false }); });"
               js_await :: JSPromise a -> IO Object

foreign import javascript safe "fetch($1)" js_fetch ::
               JSRequest -> IO (JSPromise JSResponse)

foreign import javascript safe "$1.json()" js_responseJSON ::
               JSResponse -> IO (JSPromise JSVal)

foreign import javascript safe "$1.text()" js_responseText ::
               JSResponse -> IO (JSPromise JSString)

foreign import javascript safe "new Headers()" js_newHeaders ::
               IO JSHeaders

foreign import javascript safe "$1.append($2, $3);" js_appendHeader
               :: JSHeaders -> JSString -> JSString -> IO ()

#else

ghcjsOnly :: HasCallStack => a
ghcjsOnly = error "This definition is only supported on ghcjs"

js_newRequest :: JSString -> JSVal -> IO JSRequest
js_newRequest = ghcjsOnly

js_await :: JSPromise a -> IO Object
js_await = ghcjsOnly

js_fetch :: JSRequest -> IO (JSPromise JSResponse)
js_fetch = ghcjsOnly

js_responseJSON :: JSResponse -> IO (JSPromise JSVal)
js_responseJSON = ghcjsOnly

js_responseText :: JSResponse -> IO (JSPromise JSString)
js_responseText = ghcjsOnly

js_newHeaders :: IO JSHeaders
js_newHeaders = ghcjsOnly

js_appendHeader :: JSHeaders -> JSString -> JSString -> IO ()
js_appendHeader = ghcjsOnly
#endif