generateDartCode function
Implementation
String generateDartCode(OpenApi openApi, String serverUrl) {
final str = '''
// DO NOT EDIT. AUTO GENERATED FILE.
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
${openApi.components.where((c) => c.name.toUpperCase() != c.name).map((c) => '''
class ${c.name.toUpperCamel()} ${c.xExtends == null ? '' : 'extends ${c.xExtends} '}${c.xImplements == null ? '' : 'implements ${c.xImplements} '}{
${c.properties.map((p) {
final comment = '''
${p.title == null || p.title!.isEmpty ? '' : ' /// ${p.title}'}
${p.description == null || p.description!.isEmpty ? '' : ' /// ${p.description}'}
${p.maxLength == null ? '' : ' /// Maximum length. maxLength = ${p.maxLength}'}
${p.minLength == null ? '' : ' /// Minimum length. minLength = ${p.minLength}'}
${p.pattern == null ? '' : ' /// Regular expression. pattern = ${p.pattern}'}
'''
.split('\n')
.where((l) => l.trimRight().isNotEmpty)
.join('\n');
return '''
${comment}
final ${p.dartType(openApi)} ${p.dartFieldName};
''';
}).join('')}
${c.xCalculateProperties.map((p) => '''
@override
${p.dartType} get ${p.dartFieldName} => ${p.dartCalculate};
''').join('')}
${c.name.toUpperCamel()}({
${c.properties.map((p) => '''
required this.${p.dartFieldName},
''').join('')}
});
factory ${c.name.toUpperCamel()}.fromJson(Map<String, dynamic> m) {
return ${c.name.toUpperCamel()}(
${c.properties.map((p) {
if (p.isListType) {
if (p.dartListBaseType(openApi).isObjectType) {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] == null ? ${p.nullable ? 'null' : '[]'} : (m['${p.jsonFieldName}'] as List).map((e) => ${p.dartListBaseType(openApi)}.fromJson(e)).toList(),
''';
} else {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] == null ? ${p.nullable ? 'null' : '[]'} : (m['${p.jsonFieldName}'] as List).map((e) => e as ${p.dartListBaseType(openApi)}${p.itemsNullable ? '?' : ''}).toList(),
''';
}
} else if (p.isObjectType) {
if (p.nullable) {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] == null ? null : ${p.dartType(openApi)}.fromJson(m['${p.jsonFieldName}']),
''';
} else {
return '''
${p.dartFieldName}: ${p.dartType(openApi)}.fromJson(m['${p.jsonFieldName}']),
''';
}
} else if (p.isDateTime) {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] == null
? ${p.dartType(openApi).dartTypeDefaultValue}
: DateTime.parse(m['${p.jsonFieldName}']),
''';
} else if (p.isBinary) {
if (p.nullable) {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] == null
? null : base64Decode(m['${p.jsonFieldName}']),
''';
} else {
return '''
${p.dartFieldName}: base64Decode(m['${p.jsonFieldName}']),
''';
}
} else if (p.dartType(openApi).dartTypeDefaultValue != 'null') {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'] ?? ${p.dartType(openApi).dartTypeDefaultValue},
''';
} else {
return '''
${p.dartFieldName}: m['${p.jsonFieldName}'],
''';
}
}).join('')}
);
}
static ${c.name.toUpperCamel()} get zero => ${c.name.toUpperCamel()}(
${c.properties.map((p) => '''
${p.dartFieldName}: ${p.dartType(openApi).dartTypeDefaultValue},
''').join('')}
);
Map<String, dynamic> toJson() {
return {
${c.properties.map((p) {
if (p.isBinary) {
return '''
'${p.jsonFieldName}': base64Encode(${p.dartFieldName}),
''';
} else {
return '''
'${p.jsonFieldName}': ${p.dartFieldName}${p.dartType(openApi) == 'DateTime' ? '.toIso8601String()' : ''},
''';
}
}).join('')}
};
}
@override
String toString() {
return '${c.name.toUpperCamel()}{${c.properties.map((p) => '${p.dartFieldName}: \$${p.dartFieldName}').join(', ')}}';
}
}
''').join('')}
Uri getUri(String path, Map<String, dynamic>? queryParameters) {
const url = '$serverUrl';
final scheme = url.startsWith('https://')
? 'https://'
: url.startsWith('http://')
? 'http://'
: throw 'Scheme should be https or http';
final u = url.replaceFirst(scheme, '');
final i = u.indexOf('/');
final authority = i < 0 ? u : u.substring(0, i);
final remainedPath = i < 0 ? '' : u.substring(i);
if (scheme == 'https://') {
return Uri.https(authority, '\$remainedPath\$path', queryParameters);
}
return Uri.http(authority, '\$remainedPath\$path', queryParameters);
}
class HttpRepositories {
final http.Client _httpClient;
HttpRepositories(this._httpClient);
${openApi.paths.expand((p) => p.httpMethods).where((m) => !m.xExclude).map((m) => '''
/// ${m.summary}
Future<ApiResponse<${m.okResponse.isBinary ? 'Uint8List' : m.okResponse.component == null ? 'Object' : m.okResponse.component!.dartType}>> ${m.operationId.toLowerCamel()}(
${m.parameters.map((p) => p.inParam == 'header' ? '' : p.component != null ? '''
${p.component!.dartType} ${p.name.toLowerCamel()},''' : '''
${p.property!.dartType(openApi)} ${p.name.toLowerCamel()},''').join('')}
${m.requestBody == null ? '' : '''
${m.requestBody!.content.component!.dartType} data,'''}
) async {
${m.parameters.where((p) => p.inParam == 'path').isEmpty ? 'const' : 'final'} path = '${m.pathWithReplacedParameter}';
final headers = <String, String>{};
${m.queryParameters.isEmpty ? '' : '''
final queryParameters = <String, dynamic>{};
'''}
${m.queryParameters.map((p) => p.component != null ? '''
for (final entry in ${p.name.toLowerCamel()}.toJson().entries) {
if (entry.value != null) {
if (entry.value is List) {
queryParameters[entry.key] = entry.value.map((e) => e.toString()).toList();
} else {
queryParameters[entry.key] = entry.value.toString();
}
}
}
''' : p.property!.dartType(openApi).dartTypeDefaultValue == 'null' ? '''
if (${p.name.toLowerCamel()} != null) {
${p.property!.dartType(openApi).isListType ? '''
queryParameters['${p.name.toSnake()}'] = ${p.name.toLowerCamel()}.map((e) => e.toString()).join(',');
''' : '''
queryParameters['${p.name.toSnake()}'] = ${p.name.toLowerCamel()}.toString();
'''}
}
''' : '''
${p.property!.dartType(openApi).isListType ? '''
queryParameters['${p.name.toSnake()}'] = ${p.name.toLowerCamel()}.map((e) => e.toString()).join(',');
''' : '''
queryParameters['${p.name.toSnake()}'] = ${p.name.toLowerCamel()}.toString();
'''}
''').join('')}
${m.queryParameters.isEmpty ? '''
Uri uri = getUri(path, null);
''' : '''
Uri uri = getUri(path, queryParameters);
'''}
try {
${m.method == 'get' || m.method == 'delete' ? '''
final response = await _httpClient.${m.method}(uri, headers: headers);
''' : '''
headers['content-type'] = 'application/json';
final response = await _httpClient.${m.method}(uri, headers: headers, body: ${m.requestBody == null ? 'null' : 'jsonEncode(data.toJson())'});
'''}
if (response.statusCode < 200 || response.statusCode >= 300) {
return ApiResponse.failed(response.statusCode);
}
${m.responses.single.isBinary ? '''
return ApiResponse(response.bodyBytes);
''' : m.responses.single.component == null ? '''
return ApiResponse({});
''' : '''
return ApiResponse(${m.responses.single.component!.dartType}.fromJson(jsonDecode(utf8.decode(response.bodyBytes))));
'''}
} catch (e) {
print('error in http call: \$e');
return ApiResponse.apiError();
}
}
''').join('')}
}
''';
print(str);
return formatter.format(str);
}