mirror of
https://github.com/foss42/apidash.git
synced 2025-08-05 21:10:33 +08:00
Merge branch 'main' into feat/URLSession-codegen
This commit is contained in:
@ -1,7 +1,5 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
|
||||
import 'package:apidash/models/models.dart';
|
||||
|
||||
class CCurlCodeGen {
|
||||
final String kTemplateStart = """#include <stdio.h>
|
||||
|
@ -27,6 +27,7 @@ import 'ruby/faraday.dart';
|
||||
import 'ruby/net_http.dart';
|
||||
import 'rust/actix.dart';
|
||||
import 'rust/curl_rust.dart';
|
||||
import 'rust/hyper.dart';
|
||||
import 'rust/reqwest.dart';
|
||||
import 'rust/ureq.dart';
|
||||
import 'swift/urlsession.dart';
|
||||
@ -96,6 +97,8 @@ class Codegen {
|
||||
return RustActixCodeGen().getCode(rM, boundary: boundary);
|
||||
case CodegenLanguage.rustCurl:
|
||||
return RustCurlCodeGen().getCode(rM);
|
||||
case CodegenLanguage.rustHyper:
|
||||
return RustHyperCodeGen().getCode(rM);
|
||||
case CodegenLanguage.rustReqwest:
|
||||
return RustReqwestCodeGen().getCode(rM);
|
||||
case CodegenLanguage.rustUreq:
|
||||
|
@ -1,7 +1,5 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/utils/http_utils.dart';
|
||||
|
||||
class CSharpHttpClientCodeGen {
|
||||
final String kTemplateNamespaces = r'''
|
||||
|
@ -1,9 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/extensions/extensions.dart';
|
||||
import 'package:apidash/utils/http_utils.dart';
|
||||
|
||||
class CSharpRestSharp {
|
||||
String kStringImports = """
|
||||
|
@ -1,8 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:code_builder/code_builder.dart';
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'shared.dart';
|
||||
|
||||
class DartDioCodeGen {
|
||||
|
@ -1,9 +1,8 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:code_builder/code_builder.dart';
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'shared.dart';
|
||||
|
||||
class DartHttpCodeGen {
|
||||
|
@ -1,7 +1,5 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
|
||||
import 'package:apidash/models/models.dart';
|
||||
|
||||
class GoHttpCodeGen {
|
||||
final String kTemplateStart = """package main
|
||||
|
@ -1,8 +1,5 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class JavaAsyncHttpClientGen {
|
||||
final String kStringStart = '''
|
||||
|
@ -1,8 +1,6 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, requestModelToHARJsonRequest;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import '../../utils/har_utils.dart';
|
||||
|
||||
class JavaHttpClientCodeGen {
|
||||
final String kTemplateStart = """import java.net.URI;
|
||||
|
@ -1,9 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class JavaOkHttpCodeGen {
|
||||
final String kTemplateStart = """
|
||||
|
@ -1,7 +1,5 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/utils/http_utils.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class JavaUnirestGen {
|
||||
final String kStringUnirestImports = '''
|
||||
|
@ -1,8 +1,6 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show padMultilineString, requestModelToHARJsonRequest, stripUrlParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class AxiosCodeGen {
|
||||
AxiosCodeGen({this.isNodeJs = false});
|
||||
|
@ -1,8 +1,6 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show padMultilineString, requestModelToHARJsonRequest;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class FetchCodeGen {
|
||||
FetchCodeGen({this.isNodeJs = false});
|
||||
|
@ -1,8 +1,6 @@
|
||||
import 'dart:io';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
|
||||
class JuliaHttpClientCodeGen {
|
||||
final String kTemplateStart = """
|
||||
|
@ -1,9 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class KotlinOkHttpCodeGen {
|
||||
final String kTemplateStart = """import okhttp3.OkHttpClient
|
||||
|
@ -1,7 +1,6 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
// ignore: camel_case_types
|
||||
class cURLCodeGen {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class HARCodeGen {
|
||||
String? getCode(
|
||||
|
@ -1,8 +1,5 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class PHPcURLCodeGen {
|
||||
final String kTemplateStart = r'''
|
||||
|
@ -1,7 +1,5 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show stripUrlParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class PhpGuzzleCodeGen {
|
||||
String kTemplateImport = """<?php
|
||||
|
@ -1,9 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class PhpHttpPlugCodeGen {
|
||||
final String kTemplateStart = """
|
||||
|
@ -1,9 +1,7 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class PythonHttpClientCodeGen {
|
||||
final String kTemplateStart = """import http.client
|
||||
|
@ -1,9 +1,7 @@
|
||||
import 'dart:io';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams, getFilenameFromPath;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import '../../utils/utils.dart';
|
||||
import '../codegen_utils.dart';
|
||||
|
||||
class PythonRequestsCodeGen {
|
||||
|
@ -1,8 +1,5 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
|
||||
import 'package:apidash/utils/http_utils.dart' show stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
|
||||
// Note that delete is a special case in Faraday as API Dash supports request
|
||||
// body inside delete reqest, but Faraday does not. Hence we need to manually
|
||||
|
@ -1,9 +1,5 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/extensions/extensions.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
class RubyNetHttpCodeGen {
|
||||
String kTemplateStart = """require "uri"
|
||||
|
@ -1,10 +1,8 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getNewUuid, getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class RustActixCodeGen {
|
||||
final String kTemplateStart = """
|
||||
|
@ -1,8 +1,6 @@
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, requestModelToHARJsonRequest;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import 'package:apidash/consts.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class RustCurlCodeGen {
|
||||
final String kTemplateStart = """use curl::easy::Easy;
|
||||
|
175
lib/codegen/rust/hyper.dart
Normal file
175
lib/codegen/rust/hyper.dart
Normal file
@ -0,0 +1,175 @@
|
||||
import 'dart:core';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
|
||||
class RustHyperCodeGen {
|
||||
final String kTemplateStart = """
|
||||
{% if hasForm %}extern crate hyper_multipart_rfc7578 as hyper_multipart;
|
||||
{% endif %}use hyper::{Body, Client, Request, Uri};
|
||||
{% if isHttps %}use hyper_tls::HttpsConnector;
|
||||
{% else %}use hyper::client::HttpConnector;
|
||||
{% endif %}{% if hasForm %}use hyper_multipart::client::multipart;
|
||||
{% endif %}{% if hasJsonBody %}use serde_json::json;
|
||||
{% endif %}use tokio;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let http{% if isHttps %}s{% endif %} = Http{% if isHttps %}s{% endif %}Connector::new();
|
||||
let client = Client::builder().build::<_, hyper::Body>(http{% if isHttps %}s{% endif %});
|
||||
let url = "{{ url }}".parse::<Uri>().unwrap();
|
||||
|
||||
""";
|
||||
|
||||
final String kTemplateMethod = """
|
||||
let req_builder = Request::builder()
|
||||
.method("{{ method }}")
|
||||
.uri(url)
|
||||
""";
|
||||
final String kTemplateMethodNoHeadersButForm = """
|
||||
let req_builder = Request::builder()
|
||||
.method("{{ method }}")
|
||||
.uri(url);
|
||||
""";
|
||||
|
||||
final String kTemplateHeaders = """
|
||||
{% for key, val in headers %}
|
||||
.header("{{ key }}", "{{ val }}")
|
||||
{% endfor %}""";
|
||||
|
||||
final String kTemplateHeadersFormData = """
|
||||
{% for key, val in headers %}
|
||||
.header("{{ key }}", "{{ val }}"){% if loop.last %};{% endif %}
|
||||
{% endfor %}
|
||||
""";
|
||||
|
||||
final String kTemplateBody = """
|
||||
|
||||
.body(Body::from(r#"{{ body }}"#))?;\n
|
||||
""";
|
||||
|
||||
final String kTemplateJsonBody = """
|
||||
|
||||
.body(Body::from(json!({{ body }}).to_string()))?;\n
|
||||
""";
|
||||
|
||||
final String kTemplateEmptyBody = """
|
||||
|
||||
.body(Body::empty())?;\n
|
||||
""";
|
||||
|
||||
final String kTemplateFormData = """
|
||||
|
||||
let mut form = multipart::Form::default();
|
||||
{%- for field in fields_list %}
|
||||
{%- if field.type == "file" %}
|
||||
form.add_file("{{ field.name }}", r"{{ field.value }}").unwrap();
|
||||
{%- else %}
|
||||
form.add_text("{{ field.name }}", "{{ field.value }}");
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
|
||||
let req = form.set_body_convert::<Body, multipart::Body>(req_builder).unwrap();
|
||||
|
||||
""";
|
||||
|
||||
final String kTemplateEndForm = """
|
||||
let res = client.request(req).await?;
|
||||
let status = res.status();
|
||||
let body_bytes = hyper::body::to_bytes(res).await?;
|
||||
let body = String::from_utf8(body_bytes.to_vec())?;
|
||||
|
||||
println!("Response Status: {}", status);
|
||||
println!("Response: {:?}", body);
|
||||
|
||||
|
||||
""";
|
||||
|
||||
final String kTemplateRequestEnd = """
|
||||
let res = client.request(req_builder).await?;
|
||||
let status = res.status();
|
||||
let body_bytes = hyper::body::to_bytes(res).await?;
|
||||
let body = String::from_utf8(body_bytes.to_vec())?;
|
||||
|
||||
println!("Response Status: {}", status);
|
||||
println!("Response: {:?}", body);
|
||||
|
||||
""";
|
||||
|
||||
final String kTemplateEnd = """
|
||||
Ok(())
|
||||
}
|
||||
|
||||
""";
|
||||
|
||||
String? getCode(HttpRequestModel requestModel) {
|
||||
try {
|
||||
String result = "";
|
||||
|
||||
String url = requestModel.url;
|
||||
var rec = getValidRequestUri(url, requestModel.enabledParams);
|
||||
Uri? uri = rec.$1;
|
||||
|
||||
if (uri != null) {
|
||||
var headers = requestModel.enabledHeadersMap;
|
||||
result += jj.Template(kTemplateStart).render({
|
||||
"url": uri,
|
||||
"isHttps": uri.scheme == "https" ? true : false,
|
||||
'hasJsonBody': requestModel.hasJsonData,
|
||||
'hasForm': requestModel.hasFormData,
|
||||
});
|
||||
|
||||
if (requestModel.hasFormData && headers.isEmpty) {
|
||||
result += jj.Template(kTemplateMethodNoHeadersButForm).render({
|
||||
"method": requestModel.method.name.toUpperCase(),
|
||||
});
|
||||
} else {
|
||||
result += jj.Template(kTemplateMethod).render({
|
||||
"method": requestModel.method.name.toUpperCase(),
|
||||
});
|
||||
}
|
||||
|
||||
// Add headers if available
|
||||
|
||||
if (headers.isNotEmpty) {
|
||||
if (requestModel.hasFormData) {
|
||||
result += jj.Template(kTemplateHeadersFormData)
|
||||
.render({"headers": headers});
|
||||
} else {
|
||||
result +=
|
||||
jj.Template(kTemplateHeaders).render({"headers": headers});
|
||||
}
|
||||
}
|
||||
|
||||
// Handle body (JSON or raw)
|
||||
var requestBody = requestModel.body;
|
||||
if (requestModel.hasFormData) {
|
||||
result += jj.Template(kTemplateFormData).render({
|
||||
"fields_list": requestModel.formDataMapList,
|
||||
});
|
||||
} else if (requestBody == "" ||
|
||||
requestBody == null ||
|
||||
requestModel.method == HTTPVerb.get ||
|
||||
requestModel.method == HTTPVerb.head) {
|
||||
result += kTemplateEmptyBody;
|
||||
} else if (requestModel.hasJsonData) {
|
||||
result +=
|
||||
jj.Template(kTemplateJsonBody).render({"body": requestBody});
|
||||
} else if (requestModel.hasTextData) {
|
||||
result += jj.Template(kTemplateBody).render({"body": requestBody});
|
||||
}
|
||||
// End request
|
||||
|
||||
if (requestModel.hasFormData && requestModel.method != HTTPVerb.get) {
|
||||
result += kTemplateEndForm;
|
||||
} else {
|
||||
result += kTemplateRequestEnd;
|
||||
}
|
||||
result += kTemplateEnd;
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +1,7 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
|
||||
class RustReqwestCodeGen {
|
||||
final String kTemplateStart =
|
||||
|
@ -1,10 +1,8 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'package:apidash_core/apidash_core.dart';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getNewUuid, getValidRequestUri, stripUriParams;
|
||||
import 'package:apidash/models/models.dart';
|
||||
import '../../utils/utils.dart';
|
||||
|
||||
class RustUreqCodeGen {
|
||||
final String kTemplateStart = """
|
||||
|
Reference in New Issue
Block a user