parse<T> static method

ApiResponse<T> parse<T>({
  1. required dynamic body,
  2. required int statusCode,
  3. required AutoPilotConfig cfg,
  4. T parser(
    1. dynamic json
    )?,
  5. required Duration responseTime,
  6. String? requestId,
})

Implementation

static ApiResponse<T> parse<T>({
  required dynamic body,
  required int statusCode,
  required AutoPilotConfig cfg,
  T Function(dynamic json)? parser,
  required Duration responseTime,
  String? requestId,
}) {
  try {
    if (body == null) {
      return ApiResponse<T>.success(
        statusCode: statusCode,
        responseTime: responseTime,
        requestId: requestId,
      );
    }

    if (body is Map<String, dynamic>) {
      final successRaw = body[cfg.successKey];
      final isOk = successRaw == cfg.successValue ||
          (cfg.successValue == true &&
              (successRaw == 1 || successRaw == '1')) ||
          (statusCode >= 200 && statusCode < 300 && successRaw == null);

      final msg = (body[cfg.messageKey] ?? '').toString();
      final rawData = body[cfg.dataKey] ?? body;

      if (!isOk) {
        return ApiResponse<T>.failure(
          message: msg.isNotEmpty ? msg : _httpMsg(statusCode),
          statusCode: statusCode,
          raw: body,
          errors: body['errors'] as Map<String, dynamic>?,
          responseTime: responseTime,
          requestId: requestId,
        );
      }

      T? parsed;
      if (parser != null && rawData != null) {
        parsed = _safe(parser, rawData);
      }

      return ApiResponse<T>.success(
        data: parsed,
        message: msg.isNotEmpty ? msg : 'Success',
        statusCode: statusCode,
        raw: body,
        responseTime: responseTime,
        requestId: requestId,
      );
    }

    if (body is List && parser != null) {
      final list = body.map((e) => parser(e)).toList();
      return ApiResponse<T>.success(
        data: list as T?,
        statusCode: statusCode,
        raw: body,
        responseTime: responseTime,
        requestId: requestId,
      );
    }

    // raw value (string, int, bool etc.)
    return ApiResponse<T>.success(
      data: parser != null ? _safe(parser, body) : (body as T?),
      statusCode: statusCode,
      raw: body,
      responseTime: responseTime,
      requestId: requestId,
    );
  } catch (e) {
    AutoPilotLogger.warn('Parse error: $e');
    throw ParseException('Failed to parse response: $e');
  }
}