Merge branch 'main' into add-rust-actix-codegen

This commit is contained in:
Ashita Prasad
2024-03-12 20:22:50 +05:30
committed by GitHub
5 changed files with 1228 additions and 1 deletions

View File

@ -1,12 +1,13 @@
import 'package:apidash/codegen/rust/actix.dart';
import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/models/models.dart' show RequestModel;
import 'package:apidash/consts.dart'; import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show getNewUuid; import 'package:apidash/utils/utils.dart' show getNewUuid;
import 'dart/http.dart'; import 'dart/http.dart';
import 'dart/dio.dart'; import 'dart/dio.dart';
import 'go/http.dart';
import 'kotlin/okhttp.dart'; import 'kotlin/okhttp.dart';
import 'python/http_client.dart'; import 'python/http_client.dart';
import 'python/requests.dart'; import 'python/requests.dart';
import 'rust/actix.dart';
import 'js/axios.dart'; import 'js/axios.dart';
import 'js/fetch.dart'; import 'js/fetch.dart';
import 'others/har.dart'; import 'others/har.dart';
@ -55,6 +56,8 @@ class Codegen {
return PythonRequestsCodeGen().getCode(rM, boundary: boundary); return PythonRequestsCodeGen().getCode(rM, boundary: boundary);
case CodegenLanguage.rustActix: case CodegenLanguage.rustActix:
return RustActixCodeGen().getCode(rM, boundary: boundary); return RustActixCodeGen().getCode(rM, boundary: boundary);
case CodegenLanguage.goHttp:
return GoHttpCodeGen().getCode(rM);
} }
} }
} }

172
lib/codegen/go/http.dart Normal file
View File

@ -0,0 +1,172 @@
import 'package:apidash/consts.dart';
import 'package:jinja/jinja.dart' as jj;
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
import 'package:apidash/models/models.dart' show RequestModel;
class GoHttpCodeGen {
final String kTemplateStart = """package main
import (
"fmt"
"io"
"net/http"
"net/url"{% if hasBody %}
"bytes"{% if hasFormData %}
"mime/multipart"{% if hasFileInFormData %}
"os"{% endif %}{% endif %}{% endif %}
)
func main() {
client := &http.Client{}
""";
String kTemplateUrl = """
url, _ := url.Parse("{{url}}")
""";
String kTemplateBody = """
{% if body %}payload := bytes.NewBuffer([]byte(`{{body}}`)){% endif %}
""";
String kTemplateFormData = """
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload){% if hasFileInFormData %}
var (
file *os.File
part io.Writer
){% endif %}
{% for field in fields %}
{% if field.type == "file" %}file, _ = os.Open("{{field.value}}")
defer file.Close()
part, _ = writer.CreateFormFile("{{field.name}}", "{{field.value}}")
io.Copy(part, file)
{% else %}writer.WriteField("{{field.name}}", "{{field.value}}"){% endif %}{% endfor %}
writer.Close()
""";
String kTemplateHeader = """
{% if headers %}{% for header, value in headers %}
req.Header.Set("{{header}}", "{{value}}"){% endfor %}
{% endif %}
""";
String kStringFormDataHeader = """
req.Header.Set("Content-Type", writer.FormDataContentType())
""";
String kTemplateQueryParam = """
query := url.Query()
{% for key, value in params %}
query.Set("{{key}}", "{{value}}"){% endfor %}
url.RawQuery = query.Encode()
""";
String kTemplateRequest = """
req, _ := http.NewRequest("{{method}}", url.String(), {% if hasBody %}payload{% else %}nil{% endif %})
""";
final String kTemplateEnd = """
response, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer response.Body.Close()
fmt.Println("Status Code:", response.StatusCode)
body, _ := io.ReadAll(response.Body)
fmt.Println("Response body:", string(body))
}""";
String? getCode(
RequestModel requestModel,
) {
try {
String result = "";
var hasBody = false;
var requestBody = requestModel.requestBody;
String url = requestModel.url;
var templateStart = jj.Template(kTemplateStart);
result += templateStart.render({
"hasBody": requestModel.hasData,
"hasFormData": requestModel.hasFormData,
"hasFileInFormData": requestModel.hasFileInFormData,
});
var templateUrl = jj.Template(kTemplateUrl);
result += templateUrl.render({"url": url});
var rec = getValidRequestUri(
url,
requestModel.enabledRequestParams,
);
Uri? uri = rec.$1;
if (uri != null) {
if (requestModel.hasTextData || requestModel.hasJsonData) {
hasBody = true;
var templateRawBody = jj.Template(kTemplateBody);
result += templateRawBody.render({"body": requestBody});
} else if (requestModel.hasFormData) {
hasBody = true;
var templateFormData = jj.Template(kTemplateFormData);
result += templateFormData.render({
"hasFileInFormData": requestModel.hasFileInFormData,
"fields": requestModel.formDataMapList,
});
}
if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
var templateQueryParam = jj.Template(kTemplateQueryParam);
result += templateQueryParam.render({"params": params});
}
}
var method = requestModel.method.name.toUpperCase();
var templateRequest = jj.Template(kTemplateRequest);
result += templateRequest.render({
"method": method,
"hasBody": hasBody,
});
var headersList = requestModel.enabledRequestHeaders;
if (headersList != null || requestModel.hasData) {
var headers = requestModel.enabledHeadersMap;
if (requestModel.hasJsonData || requestModel.hasTextData) {
headers.putIfAbsent(kHeaderContentType,
() => requestModel.requestBodyContentType.header);
}
if (headers.isNotEmpty) {
var templateHeader = jj.Template(kTemplateHeader);
result += templateHeader.render({
"headers": headers,
});
}
}
if (requestModel.hasFormData) {
result += kStringFormDataHeader;
}
result += kTemplateEnd;
}
return result;
} catch (e) {
return null;
}
}
}

View File

@ -266,6 +266,7 @@ enum CodegenLanguage {
har("HAR", "json", "har"), har("HAR", "json", "har"),
dartHttp("Dart (http)", "dart", "dart"), dartHttp("Dart (http)", "dart", "dart"),
dartDio("Dart (dio)", "dart", "dart"), dartDio("Dart (dio)", "dart", "dart"),
goHttp("Go (http)", "go", "go"),
jsAxios("JavaScript (axios)", "javascript", "js"), jsAxios("JavaScript (axios)", "javascript", "js"),
jsFetch("JavaScript (fetch)", "javascript", "js"), jsFetch("JavaScript (fetch)", "javascript", "js"),
nodejsAxios("node.js (axios)", "javascript", "js"), nodejsAxios("node.js (axios)", "javascript", "js"),

View File

@ -68,6 +68,7 @@ class RequestModel {
bool get hasJsonContentType => requestBodyContentType == ContentType.json; bool get hasJsonContentType => requestBodyContentType == ContentType.json;
bool get hasTextContentType => requestBodyContentType == ContentType.text; bool get hasTextContentType => requestBodyContentType == ContentType.text;
int get contentLength => utf8.encode(requestBody ?? "").length; int get contentLength => utf8.encode(requestBody ?? "").length;
bool get hasData => hasJsonData || hasTextData || hasFormData;
bool get hasJsonData => bool get hasJsonData =>
kMethodsWithBody.contains(method) && kMethodsWithBody.contains(method) &&
hasJsonContentType && hasJsonContentType &&
@ -84,6 +85,9 @@ class RequestModel {
requestFormDataList ?? <FormDataModel>[]; requestFormDataList ?? <FormDataModel>[];
List<Map<String, dynamic>> get formDataMapList => List<Map<String, dynamic>> get formDataMapList =>
rowsToFormDataMapList(requestFormDataList) ?? []; rowsToFormDataMapList(requestFormDataList) ?? [];
bool get hasFileInFormData => formDataList
.map((e) => e.type == FormDataType.file)
.any((element) => element);
bool get hasContentTypeHeader => enabledHeadersMap.keys bool get hasContentTypeHeader => enabledHeadersMap.keys
.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); .any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader);

File diff suppressed because it is too large Load Diff