Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
61c5dde
Resolving conflicts
badnikhil Mar 19, 2025
1fb40b8
Codegen updated for dart(http/dio)
badnikhil Mar 19, 2025
9296bab
Updated GO
badnikhil Mar 20, 2025
28b6bc2
Updated C#
badnikhil Mar 21, 2025
0b8dd91
updated js
badnikhil Mar 21, 2025
daf3df5
Updated Swift
badnikhil Mar 23, 2025
bbc0c3a
fix swift
badnikhil Mar 23, 2025
cf93885
Updated Java
badnikhil Mar 24, 2025
4687327
julia
badnikhil Mar 24, 2025
1639323
kotlin
badnikhil Mar 24, 2025
3b00e99
php
badnikhil Apr 3, 2025
9f64c70
pythom
badnikhil Apr 3, 2025
f8613a0
python - httpclient
badnikhil Apr 3, 2025
5a75442
rust-actix-hyper
badnikhil Apr 3, 2025
d0ce42a
rust all
badnikhil Apr 3, 2025
5f58d33
ruby
badnikhil Apr 4, 2025
c05e61b
datatype changes
badnikhil Apr 6, 2025
70d9215
updated datatypes
badnikhil Apr 10, 2025
f5f5c4d
updated test
badnikhil May 10, 2025
ac01513
Update codegen.dart
badnikhil May 11, 2025
8dce592
Update main.dart
badnikhil May 11, 2025
8070e86
Update main.dart
badnikhil May 11, 2025
bf0f7e7
minor optimisation/fixes in codegen
badnikhil May 14, 2025
54ddb09
updated test model (reqres API key)
badnikhil May 18, 2025
ac5c1da
updated C curl tests
badnikhil May 18, 2025
e1fa273
updated har tests
badnikhil May 18, 2025
f87ef8c
updated csharp tests
badnikhil May 18, 2025
18ae60c
curl updated tests
badnikhil May 18, 2025
3007d6f
updated go tests
badnikhil May 18, 2025
2239911
updated dart tests
badnikhil May 18, 2025
857307d
updated java test
badnikhil May 21, 2025
21cc9aa
updated js tests
badnikhil May 21, 2025
f1d6673
updated julia tests
badnikhil May 22, 2025
857e0c1
updated kotlin tests
badnikhil May 22, 2025
f2ca3ea
updated nodejs test and codegen
badnikhil May 22, 2025
cc6c49c
updated php tests
badnikhil May 29, 2025
0bd511d
updated python tests
badnikhil Jun 4, 2025
34c8eb1
updated ruby-net
badnikhil Jun 4, 2025
976a7a0
updated ruby-faraday
badnikhil Jun 4, 2025
0198c55
updated tests for rust
badnikhil Jul 8, 2025
0b4e71f
updated swift tests
badnikhil Jul 12, 2025
1de0101
some missed tests updated
badnikhil Jul 13, 2025
e60fb29
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Jul 13, 2025
6622577
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Jul 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 39 additions & 20 deletions lib/codegen/csharp/http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,32 @@ class CSharpHttpClientCodeGen {
final String kTemplateNamespaces = r'''
using System;
using System.Net.Http;
using System.Collections.Generic;
using System.Linq;
{%- if formdata == 'multipart' %}
using System.IO;
{%- elif formdata == 'urlencoded' %}
using System.Collections.Generic;
{%- endif %}

''';

final String kTemplateUri = '''
string uri = "{{ uri }}";

final String kTemplateQueryParams = '''
string baseUri = "{{ baseUri }}";

var query = new Dictionary<string, List<string>>();
{%- for key, values in queryParams %}
query["{{ key }}"] = new List<string>();
{%- for value in values %}
query["{{ key }}"].Add("{{ value }}");
{%- endfor %}
{%- endfor %}

var queryString = string.Join("&", query.SelectMany(kv => kv.Value.Select(v => string.Format("{0}={1}", kv.Key, v))));
string uri = string.Format("{0}?{1}", baseUri, queryString);
''';



final String kTemplateHttpClientAndRequest = '''
using (var client = new HttpClient())
using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}, uri))
Expand Down Expand Up @@ -81,17 +94,23 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
StringBuffer result = StringBuffer();

// Include necessary C# namespace
String formdataImport = requestModel.hasFormData
? "multipart" //(requestModel.hasFileInFormData ? "multipart" : "urlencoded")
: "nodata";
String formdataImport = requestModel.hasFormData
? "multipart" //(requestModel.hasFileInFormData ? "multipart" : "urlencoded")
: "nodata";
result.writeln(jj.Template(kTemplateNamespaces)
.render({"formdata": formdataImport}));

// Set request URL
var (uri, _) =
getValidRequestUri(requestModel.url, requestModel.enabledParams);
if (uri != null) {
result.writeln(jj.Template(kTemplateUri).render({"uri": uri}));
.render({"formdata": formdataImport}));

// Extract query parameters and URL
String baseUri = requestModel.url.split('?')[0];
var queryParams = requestModel.enabledParamsMap;

if (queryParams.isNotEmpty) {
result.writeln(jj.Template(kTemplateQueryParams).render({
"baseUri": baseUri,
"queryParams": queryParams,
}));
} else {
result.writeln('string uri = "$baseUri";\n');
}

// Initialize HttpClient and create HttpRequestMessage
Expand All @@ -103,18 +122,18 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
var headers = requestModel.enabledHeadersMap;
if (headers.isNotEmpty) {
result.writeln(
jj.Template(kTemplateHeaders).render({"headers": headers}));
jj.Template(kTemplateHeaders).render({"headers": headers}));
}

// Set request body if exists
if (kMethodsWithBody.contains(requestModel.method) &&
requestModel.hasBody) {
requestModel.hasBody) {
var requestBody = requestModel.body;

if (!requestModel.hasFormData &&
requestBody != null &&
requestBody.isNotEmpty) {
// if the request body is not formdata then render raw text body
requestBody != null &&
requestBody.isNotEmpty) {
// if the request body is not formdata then render raw text body
result.writeln(jj.Template(kTemplateRawBody).render({
"body": requestBody,
"mediaType": requestModel.bodyContentType.header,
Expand All @@ -133,7 +152,7 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
result.writeln(kStringContentSetup);
}

// Send request and get response
// Send request and get response
result.write(kStringEnd);
return result.toString();
} catch (e) {
Expand Down
21 changes: 11 additions & 10 deletions lib/codegen/csharp/rest_sharp.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,19 +113,20 @@ class Program
});
result += methodType;

if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
jj.Template templateParams = jj.Template(kTemplateParams);
String paramsResult = "";
for (var item in params.entries) {
paramsResult += templateParams
.render({"param": item.key, "value": item.value});
if (requestModel.enabledParamsMap.isNotEmpty) {
jj.Template templateParams = jj.Template(kTemplateParams);
String paramsResult = "";

requestModel.enabledParamsMap.forEach((key, values) {
for (var value in values) {
paramsResult += templateParams.render({"param": key, "value": value});
}
result += "$paramsResult\n";
}
});

result += "$paramsResult\n";
}


var headersList = requestModel.enabledHeaders;
if (headersList != null ||
requestModel.hasJsonData ||
Expand Down
7 changes: 4 additions & 3 deletions lib/codegen/dart/dio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class DartDioCodeGen {
String generatedDartCode({
required String url,
required HTTPVerb method,
required Map<String, String> queryParams,
required Map<String, dynamic> queryParams,
required Map<String, String> headers,
required String? body,
required ContentType contentType,
Expand Down Expand Up @@ -87,11 +87,12 @@ class DartDioCodeGen {
dataExp = declareFinal('data').assign(refer('dio.FormData()'));
}
}
final parsedUrl = url.split('?').first;
final responseExp = declareFinal('response').assign(InvokeExpression.newOf(
refer('dio.Dio()'),
[literalString(url)],
[literalString(parsedUrl)],
{
if (queryParamExp != null) 'queryParameters': refer('queryParams'),
if (queryParamExp != null) 'queryParameters': refer('queryParams'),
if (headerExp != null)
'options': refer('dio.Options').newInstance(
[],
Expand Down
10 changes: 5 additions & 5 deletions lib/codegen/dart/http.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DartHttpCodeGen {
String generatedDartCode({
required String url,
required HTTPVerb method,
required Map<String, String> queryParams,
required Map<String, dynamic> queryParams,
required Map<String, String> headers,
required ContentType contentType,
required String? body,
Expand All @@ -43,9 +43,9 @@ class DartHttpCodeGen {
final emitter = DartEmitter();
final dioImport = Directive.import('package:http/http.dart', as: 'http');
sbf.writeln(dioImport.accept(emitter));

final parsedUrl = url.split('?').first;
final uriExp =
declareVar('uri').assign(refer('Uri.parse').call([literalString(url)]));
declareVar('uri').assign(refer('Uri.parse').call([literalString(parsedUrl)]));

Expression? dataExp;
if (kMethodsWithBody.contains(method) &&
Expand All @@ -61,7 +61,7 @@ class DartHttpCodeGen {

Expression? queryParamExp;
List<Expression>? uriReassignExps;
// var urlQueryParams = Map<String,String>.from(uri.queryParameters);
// var urlQueryParams = Map<String,dynamic>.from(uri.queryParameters);
// urlQueryParams.addAll(queryParams);
// uri = uri.replace(queryParameters: urlQueryParams);

Expand All @@ -74,7 +74,7 @@ class DartHttpCodeGen {
if (uri.hasQuery)
declareVar('urlQueryParams').assign(
InvokeExpression.newOf(
refer('Map<String,String>'),
refer('Map<String,dynamic>'),
[refer('uri.queryParameters')],
{},
[],
Expand Down
27 changes: 15 additions & 12 deletions lib/codegen/go/http.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,15 @@ func main() {
""";

String kTemplateQueryParam = """
query := url.Query()
{% for key, value in params %}
query.Set("{{key}}", "{{value}}"){% endfor %}
query := url.Query()
{% for param in params %}
query.Add("{{param.key}}", "{{param.value}}"){% endfor %}

url.RawQuery = query.Encode()
url.RawQuery = query.Encode()

""";


String kTemplateRequest = """
req, _ := http.NewRequest("{{method}}", url.String(), {% if hasBody %}payload{% else %}nil{% endif %})

Expand Down Expand Up @@ -102,7 +103,7 @@ func main() {
});

var templateUrl = jj.Template(kTemplateUrl);
result += templateUrl.render({"url": url});
result += templateUrl.render({"url": url.split('?').first});

var rec = getValidRequestUri(
url,
Expand All @@ -124,15 +125,17 @@ func main() {
"fields": requestModel.formDataMapList,
});
}

if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
var templateQueryParam = jj.Template(kTemplateQueryParam);
result += templateQueryParam.render({"params": params});
}
if (requestModel.enabledParamsMap.isNotEmpty) {
var queryParams = [];
requestModel.enabledParamsMap.forEach((key, value) {
for (var v in value) {
queryParams.add({'key': key, 'value': v});
}
});

var templateQueryParam = jj.Template(kTemplateQueryParam);
result += templateQueryParam.render({"params": queryParams});
}
var method = requestModel.method.name.toUpperCase();
var templateRequest = jj.Template(kTemplateRequest);
result += templateRequest.render({
Expand Down
9 changes: 4 additions & 5 deletions lib/codegen/java/async_http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,10 @@ public class Main {
BoundRequestBuilder requestBuilder = asyncHttpClient.prepare("{{ method|upper }}", url);\n
''';

final String kTemplateUrlQueryParam = '''
requestBuilder{% for name, value in queryParams %}
.addQueryParam("{{ name }}", "{{ value }}"){% endfor %};\n
final String kTemplateUrlQueryParam = '''
{% for name, value in queryParams %} {% for v in value %}
requestBuilder.addQueryParam("{{ name }}", "{{ v }}"); {% endfor %}{% endfor %}\n
''';

final String kTemplateRequestHeader = '''
requestBuilder{% for name, value in headers %}
.addHeader("{{ name }}", "{{ value }}"){% endfor %};\n
Expand Down Expand Up @@ -158,7 +157,7 @@ public class Main {
result += templateRequestCreation.render({"method": method.name});

// setting up query parameters
var params = uri.queryParameters;
var params = requestModel.enabledParamsMap;
if (params.isNotEmpty) {
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
result += templateUrlQueryParam.render({"queryParams": params});
Expand Down
24 changes: 9 additions & 15 deletions lib/codegen/java/okhttp.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@ import okhttp3.MultipartBody;""";

''';

final String kTemplateUrlQuery = '''
final String kTemplateUrlQuery = '''
HttpUrl.Builder urlBuilder = HttpUrl.parse("{{url}}").newBuilder();
{% for name, value in queryParams %}{% for v in value %}
urlBuilder.addQueryParameter("{{ name }}", "{{ v }}");{% endfor %}{% endfor %}
HttpUrl url = urlBuilder.build();
''';

HttpUrl url = HttpUrl.parse("{{url}}").newBuilder()
{{params}}
.build();

''';

String kTemplateRequestBody = '''

MediaType mediaType = MediaType.parse("{{contentType}}");

RequestBody body = RequestBody.create({{body}}, mediaType);
Expand Down Expand Up @@ -107,12 +107,12 @@ import okhttp3.MultipartBody;""";
String url = stripUriParams(uri);

if (uri.hasQuery) {
var params = uri.queryParameters;
var params = requestModel.enabledParamsMap;
if (params.isNotEmpty) {
hasQuery = true;
var templateParams = jj.Template(kTemplateUrlQuery);
result += templateParams
.render({"url": url, "params": getQueryParams(params)});
.render({"url": url, "queryParams": params});
}
}
if (!hasQuery) {
Expand Down Expand Up @@ -172,12 +172,6 @@ import okhttp3.MultipartBody;""";
}
}

String getQueryParams(Map<String, String> params) {
final paramStrings = params.entries
.map((entry) => '.addQueryParameter("${entry.key}", "${entry.value}")')
.toList();
return paramStrings.join('\n ');
}

String getHeaders(Map<String, String> headers) {
String result = "";
Expand Down
28 changes: 14 additions & 14 deletions lib/codegen/java/unirest.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:jinja/jinja.dart' as jj;

class JavaUnirestGen {
final String kStringUnirestImports = '''
import kong.unirest.core.*;
import kong.unirest.*;

''';

Expand All @@ -27,18 +27,21 @@ public class Main {
''';

final String kTemplateRequestCreation = '''
HttpResponse<JsonNode> response = Unirest
.{{method}}(requestURL)\n
HttpResponse<JsonNode> response = Unirest.{{method}}(requestURL)\n
''';

final String kTemplateRequestHeader = '''
.header("{{name}}", "{{value}}")\n
''';

final String kTemplateUrlQueryParam = '''
.queryString("{{name}}", "{{value}}")\n
final String kTemplateUrlQueryParam = '''
{% for name, value in queryParams %}{% for v in value -%}
.queryString("{{name}}", "{{v}}")
{% endfor %}{% endfor %}
''';



final String kTemplateRequestTextFormData = '''
.field("{{name}}", "{{value}}")\n
''';
Expand All @@ -52,7 +55,7 @@ public class Main {
''';

final String kStringRequestEnd = """
.asJson();
.asJson();
System.out.println(response.getStatus());
System.out.println(response.getBody());
}
Expand Down Expand Up @@ -125,14 +128,11 @@ public class Main {

// ~~~~~~~~~~~~~~~~~~ query parameters start ~~~~~~~~~~~~~~~~~~

if (uri.hasQuery) {
var params = uri.queryParameters;
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
params.forEach((name, value) {
result +=
templateUrlQueryParam.render({"name": name, "value": value});
});
}

var params = requestModel.enabledParamsMap;
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
result += templateUrlQueryParam.render({"queryParams": params});


// ~~~~~~~~~~~~~~~~~~ query parameters end ~~~~~~~~~~~~~~~~~~

Expand Down
Loading