module Servant.PY.Requests where
import Data.Monoid ( (<>) )
import Data.Proxy
import Data.Text (Text)
import qualified Data.Text as T
import Servant.PY.Internal
requests :: PythonGenerator
requests reqs = defPyImports <> mconcat (map requestsWithDef reqs)
requestsWith :: CommonGeneratorOptions -> [PythonRequest] -> Text
requestsWith opts reqs = mconcat (map (generatePyRequestWith opts) reqs)
requestsWithDef :: PythonRequest -> Text
requestsWithDef = generatePyRequestWith defCommonGeneratorOptions
defPyImports :: Text
defPyImports =
T.unlines
[ "from urllib import parse"
, ""
, "import requests"
]
generatePyRequestWith :: CommonGeneratorOptions -> PythonRequest -> Text
generatePyRequestWith opts req = "\n" <>
"def " <> functionName opts req <> "(" <> argsStr <> "):\n"
<> indent' <> docStringMarker
<> indent' <> buildDocString req opts returnVal <> "\n"
<> indent' <> docStringMarker
<> indent' <> "url = " <> makePyUrl opts req (indent' <> indent') <> "\n\n"
<> headerDef
<> paramDef
<> requestBuilder <> "(url" <> remaining (T.length requestBuilder + 1) <> "\n"
<> functionReturn (returnMode opts) (indentation opts)
<> "\n\n"
where argsStr = T.intercalate ", " args
args = captures req
++ qparams
++ body
++ map (toValidFunctionName
. (<>) "header"
) hs
hs = retrieveHeaders req
qparams = paramNames req
method = T.toLower $ getMethod req
remaining = remainingReqCall $ PyRequestArgs (not . null $ hs) (not . null $ qparams) (hasBody req)
paramDef
| null qparams = ""
| otherwise = indent' <> "params = " <> getParams (indent' <> indent') req <> "\n"
headerDef
| null hs = ""
| otherwise = indent' <> "headers = " <> getHeaderDict req <> "\n"
requestBuilder = indent' <> "resp = requests." <> method
body = [requestBody opts | hasBody req]
indent' = indentation opts indent
docStringMarker = "\"\"\"\n"
returnVal = case returnMode opts of
DangerMode -> "JSON response from the endpoint"
RawResponse -> "response (requests.Response) from issuing the request"
functionReturn :: ReturnStyle -> (Proxy Indent -> T.Text) -> T.Text
functionReturn DangerMode pyindenter = indent' <> "resp.raise_for_status()\n"
<> indent' <> "return resp.json()"
where indent' = pyindenter indent
functionReturn RawResponse pyindenter = indent' <> "return resp"
where indent' = pyindenter indent