import 'package:apidash_core/apidash_core.dart'; import 'package:jinja/jinja.dart' as jj; import 'package:path/path.dart' as path; class SwiftAlamofireCodeGen { final String kTemplateStart = """ import Alamofire """; final String kTemplateFormDataImport = """ import MultipartFormData """; final String kTemplateFormData = ''' let boundary = try! Boundary() let multipartFormData = try! MultipartFormData(boundary: boundary) { {% for param in formData %} {% if param.type == 'text' %} Subpart { ContentDisposition(name: "{{param.name}}") } body: { Data("{{param.value}}".utf8) } {% elif param.type == 'file' %} try Subpart { ContentDisposition(name: "{{param.name}}", filename: "{{param.filename}}") ContentType(mimeType: MimeType(pathExtension: "{{param.extension}}")) } body: { try Data(contentsOf: URL(fileURLWithPath: "{{param.filepath}}")) } {% endif %} {% endfor %} } '''; final String kTemplateJsonData = ''' let parameters = "{{jsonData}}" let postData = parameters.data(using: .utf8) '''; final String kTemplateTextData = ''' let parameters = "{{textData}}" let postData = parameters.data(using: .utf8) '''; final String kTemplateRequest = """ AF.request("{{url}}", method: .{{method}}, parameters: {{parameters}}, encoding: {{encoding}}) .responseJSON { response in switch response.result { case .success(let value): print("Response: \\(value)") case .failure(let error): print("Error: \\(error)") } } """; final String kTemplateHeaders = """ {% for header, value in headers %} request.addValue("{{value}}", forHTTPHeaderField: "{{header}}") {% endfor %} """; String? getCode(HttpRequestModel requestModel) { try { String result = kTemplateStart; if (requestModel.hasFormData) { result += kTemplateFormDataImport; } var rec = getValidRequestUri(requestModel.url, requestModel.enabledParams); Uri? uri = rec.$1; var headers = requestModel.enabledHeadersMap; var parameters = 'nil'; if (requestModel.hasFormData) { var formDataList = requestModel.formDataMapList.map((param) { if (param['type'] == 'file') { final filePath = param['value'] as String; final fileName = path.basename(filePath); final fileExtension = path.extension(fileName).toLowerCase().replaceFirst('.', ''); return { 'type': 'file', 'name': param['name'], 'filename': fileName, 'extension': fileExtension, 'filepath': filePath }; } else { return { 'type': 'text', 'name': param['name'], 'value': param['value'] }; } }).toList(); var templateFormData = jj.Template(kTemplateFormData); result += templateFormData.render({ "formData": formDataList, }); parameters = "multipartFormData"; } else if (requestModel.hasJsonData) { var templateJsonData = jj.Template(kTemplateJsonData); result += templateJsonData.render({ "jsonData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); parameters = "parameters"; } else if (requestModel.hasTextData) { var templateTextData = jj.Template(kTemplateTextData); result += templateTextData.render({ "textData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); parameters = "parameters"; } var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ "url": uri.toString(), "method": requestModel.method.name.toLowerCase(), "parameters": parameters, "encoding": requestModel.hasFormData ? "JSONEncoding.default" : "URLEncoding.default" }); if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeaders); result += templateHeader.render({"headers": headers}); } return result; } catch (e) { return null; } } }