generateDartCode function

String generateDartCode(
  1. OpenApi openApi,
  2. String serverUrl
)

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);
}