From 168d1dc678c8054ed83092b1c58ecb5df0ff7263 Mon Sep 17 00:00:00 2001 From: Yannick Chiron Date: Sun, 11 Oct 2020 00:58:02 +0200 Subject: [PATCH] feat:add code generator for C# RestSharp --- .../__snapshots__/codegen.spec.js.snap | 89 ++++++++++++++++++ helpers/codegen/codegen.js | 2 + helpers/codegen/generators/cs-restsharp.js | 90 +++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 helpers/codegen/generators/cs-restsharp.js diff --git a/helpers/codegen/__tests__/__snapshots__/codegen.spec.js.snap b/helpers/codegen/__tests__/__snapshots__/codegen.spec.js.snap index 74e6df952..93ffe69a1 100644 --- a/helpers/codegen/__tests__/__snapshots__/codegen.spec.js.snap +++ b/helpers/codegen/__tests__/__snapshots__/codegen.spec.js.snap @@ -1,5 +1,94 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`generate request for C# RestSharp generate GET request 1`] = ` +"var client = new RestClient(\\"https://httpbin.org\\"); + +var request = new RestRequest(\\"/path/to?a=b\\", DataFormat.Xml); + +client.Authenticator = new HttpBasicAuthenticator(\\"mockUser\\", \\"mockPassword\\"); +request.AddHeader(\\"h1\\", \\"h1v\\"); +request.AddHeader(\\"h2\\", \\"h2v\\"); + +var response = client.Get(request); + +if (!response.IsSuccessful) +{ + Console.WriteLine(\\"An error occured \\" + response.ErrorMessage); +} + +var result = response.Content; +" +`; + +exports[`generate request for C# RestSharp generate POST request for JSON 1`] = ` +"var client = new RestClient(\\"https://httpbin.org\\"); + +var request = new RestRequest(\\"/path/to?a=b\\", DataFormat.Json); + +request.AddHeader(\\"Authorization\\", \\"Bearer abcdefghijklmn\\"); +request.AddHeader(\\"Content-Type\\", \\"application/json\\"); +request.AddHeader(\\"h1\\", \\"h1v\\"); +request.AddHeader(\\"h2\\", \\"h2v\\"); + +request.AddParameter(\\"text/json\\", @\\"{\\"\\"foo\\"\\": \\"\\"bar\\"\\", \\"\\"baz\\"\\": \\"\\"qux\\"\\"}\\", ParameterType.RequestBody); + +var response = client.Post(request); + +if (!response.IsSuccessful) +{ + Console.WriteLine(\\"An error occured \\" + response.ErrorMessage); +} + +var result = response.Content; +" +`; + +exports[`generate request for C# RestSharp generate POST request for XML 1`] = ` +"var client = new RestClient(\\"https://httpbin.org\\"); + +var request = new RestRequest(\\"/path/to?a=b\\", DataFormat.Xml); + +request.AddHeader(\\"Authorization\\", \\"Bearer abcdefghijklmn\\"); +request.AddHeader(\\"Content-Type\\", \\"application/xml\\"); +request.AddHeader(\\"h1\\", \\"h1v\\"); +request.AddHeader(\\"h2\\", \\"h2v\\"); + +request.AddParameter(\\"text/xml\\", @\\" + + +\\", ParameterType.RequestBody); + +var response = client.Post(request); + +if (!response.IsSuccessful) +{ + Console.WriteLine(\\"An error occured \\" + response.ErrorMessage); +} + +var result = response.Content; +" +`; + +exports[`generate request for C# RestSharp generate PUT request for www-form-urlencoded 1`] = ` +"var client = new RestClient(\\"https://httpbin.org\\"); + +var request = new RestRequest(\\"/path/to?a=b\\", DataFormat.Xml); + +request.AddHeader(\\"Content-Type\\", \\"application/x-www-form-urlencoded\\"); + +request.AddParameter(\\"text/xml\\", @\\"foo=bar&baz=qux\\", ParameterType.RequestBody); + +var response = client.Put(request); + +if (!response.IsSuccessful) +{ + Console.WriteLine(\\"An error occured \\" + response.ErrorMessage); +} + +var result = response.Content; +" +`; + exports[`generate request for Golang Native generate GET request 1`] = ` "req, err := http.NewRequest(\\"GET\\", \\"https://httpbin.org/path/to?a=b\\") req.Header.Set(\\"Authorization\\", \\"Basic bW9ja1VzZXI6bW9ja1Bhc3N3b3Jk\\") diff --git a/helpers/codegen/codegen.js b/helpers/codegen/codegen.js index 9d792e277..690c4ee8e 100644 --- a/helpers/codegen/codegen.js +++ b/helpers/codegen/codegen.js @@ -11,6 +11,7 @@ import { PhpCurlCodegen } from "./generators/php-curl" import { PythonRequestsCodegen } from "./generators/python-requests" import { PythonHttpClientCodegen } from "./generators/python-http-client" import { WgetCodegen } from "./generators/wget" +import { CsRestSharpCodegen } from "./generators/cs-restsharp" /* Register code generators here. * A code generator is defined as an object with the following structure. @@ -22,6 +23,7 @@ import { WgetCodegen } from "./generators/wget" */ export const codegens = [ CurlCodegen, + CsRestSharpCodegen, GoNativeCodegen, JSAxiosCodegen, JSFetchCodegen, diff --git a/helpers/codegen/generators/cs-restsharp.js b/helpers/codegen/generators/cs-restsharp.js new file mode 100644 index 000000000..ac6032316 --- /dev/null +++ b/helpers/codegen/generators/cs-restsharp.js @@ -0,0 +1,90 @@ +import { isJSONContentType } from "~/helpers/utils/contenttypes" + +export const CsRestSharpCodegen = { + id: "cs-restsharp", + name: "C# RestSharp", + generator: ({ + url, + pathName, + queryString, + auth, + httpUser, + httpPassword, + bearerToken, + method, + rawInput, + rawParams, + rawRequestBody, + contentType, + headers, + }) => { + const requestString = [] + + // initial request setup + let requestBody = rawInput ? rawParams : rawRequestBody + requestBody = requestBody.replace(/"/g,'""'); // escape quotes for C# verbatim string compatibility + + // prepare data + let requestDataFormat; + let requestContentType; + + if(isJSONContentType(contentType)) { + requestDataFormat = 'DataFormat.Json' + requestContentType = 'text/json' + } else { + requestDataFormat = 'DataFormat.Xml' + requestContentType = 'text/xml' + } + + const verbs = [ + { verb: 'GET', csMethod: 'Get' }, + { verb: 'POST', csMethod: 'Post' }, + { verb: 'PUT', csMethod: 'Put' }, + { verb: 'PATCH', csMethod: 'Patch' }, + { verb: 'DELETE', csMethod: 'Delete' }, + ] + + // create client and request + requestString.push(`var client = new RestClient("${url}");\n\n`) + requestString.push(`var request = new RestRequest("${pathName}${queryString}", ${requestDataFormat});\n\n`) + + // authentification + if (auth === "Basic Auth") { + requestString.push(`client.Authenticator = new HttpBasicAuthenticator("${httpUser}", "${httpPassword}");\n`) + } else if (auth === "Bearer Token" || auth === "OAuth 2.0") { + requestString.push(`request.AddHeader("Authorization", "Bearer ${bearerToken}");\n`) + } + + // content type + if (contentType) { + requestString.push(`request.AddHeader("Content-Type", "${contentType}");\n`) + } + + // custom headers + if (headers) { + headers.forEach(({ key, value }) => { + if (key) { + requestString.push(`request.AddHeader("${key}", "${value}");\n`) + } + }) + } + + requestString.push(`\n`) + + // set body + if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) { + requestString.push(`request.AddParameter("${requestContentType}", @"${requestBody}", ParameterType.RequestBody);\n\n`) + } + + // process + const verb = verbs.find(v => v.verb === method) + requestString.push(`var response = client.${verb.csMethod}(request);\n\n`) + + // analyse result + requestString.push(`if (!response.IsSuccessful)\n{\n Console.WriteLine("An error occured " + response.ErrorMessage);\n}\n\n`) + + requestString.push(`var result = response.Content;\n`) + + return requestString.join("") + }, +}