diff --git a/helpers/codegen/codegen.js b/helpers/codegen/codegen.js index 0964d25c1..66487e096 100644 --- a/helpers/codegen/codegen.js +++ b/helpers/codegen/codegen.js @@ -2,6 +2,7 @@ import { JSXHRCodegen } from "./generators/js-xhr" import { JSFetchCodegen } from "./generators/js-fetch" import { CurlCodegen } from "./generators/curl" import { JSAxiosCodegen } from "./generators/js-axios" +import { GoNativeCodegen } from "./generators/go-native" /* Register code generators here. * A code generator is defined as an object with the following structure. @@ -11,7 +12,7 @@ import { JSAxiosCodegen } from "./generators/js-axios" * generator: (ctx) => string * */ -export const codegens = [JSXHRCodegen, JSFetchCodegen, CurlCodegen, JSAxiosCodegen] +export const codegens = [JSXHRCodegen, JSFetchCodegen, CurlCodegen, JSAxiosCodegen, GoNativeCodegen] export function generateCodeWithGenerator(codegenID, context) { if (codegenID) { diff --git a/helpers/codegen/generators/go-native.js b/helpers/codegen/generators/go-native.js new file mode 100644 index 000000000..692b9893f --- /dev/null +++ b/helpers/codegen/generators/go-native.js @@ -0,0 +1,72 @@ +import { isJSONContentType } from "~/helpers/utils/contenttypes" + +export const GoNativeCodegen = { + id: "go-native", + name: "Golang Native", + generator: ({ + url, + pathName, + queryString, + auth, + httpUser, + httpPassword, + bearerToken, + method, + rawInput, + rawParams, + rawRequestBody, + contentType, + headers, + }) => { + const requestString = [] + let genHeaders = [] + // initial request setup + let requestBody = rawInput ? rawParams : rawRequestBody + if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) { + if (isJSONContentType(contentType)) { + requestString.push(`var reqBody = []byte(\`${requestBody}\`)\n\n`) + requestString.push( + `req, err := http.NewRequest("${method}", "${url}${pathName}${queryString}", bytes.NewBuffer(reqBody))\n` + ) + } else if (contentType.includes("x-www-form-urlencoded")) { + requestString.push( + `req, err := http.NewRequest("${method}", "${url}${pathName}${queryString}", strings.NewReader("${requestBody}"))\n` + ) + } + } + + // headers + genHeaders.push(`req.Header.Set("Content-Type", "${contentType}")\n`) + // auth + if (auth === "Basic Auth") { + const basic = `${httpUser}:${httpPassword}` + genHeaders.push( + `req.Header.Set("Authorization", "Basic ${window.btoa( + unescape(encodeURIComponent(basic)) + )}")\n` + ) + } else if (auth === "Bearer Token" || auth === "OAuth 2.0") { + genHeaders.push(`req.Header.Set("Authorization", "Bearer ${bearerToken}")\n`) + } + // custom headers + if (headers) { + headers.forEach(({ key, value }) => { + if (key) genHeaders.push(`req.Header.Set("${key}", "${value}")\n`) + }) + } + genHeaders = genHeaders.join("").slice(0, -1) + requestString.push(`${genHeaders}\n`) + requestString.push(`if err != nil {\n log.Fatalf("An Error Occured %v", err)\n}\n\n`) + + // request boilerplate + requestString.push(`client := &http.Client{}\n`) + requestString.push( + `resp, err := client.Do(req)\nif err != nil {\n log.Fatalf("An Error Occured %v", err)\n}\n\n` + ) + requestString.push(`defer resp.Body.Close()\n`) + requestString.push( + `body, err := ioutil.ReadAll(resp.Body)\nif err != nil {\n log.Fatalln(err)\n}\n` + ) + return requestString.join("") + }, +}