execute method

Executes the AdminCreateUser request

@return Future resolving to AdminCreateUserResult @throws CognitoValidationException for invalid parameters @throws CognitoServiceException for API failures

Implementation

Future<CognitoAdminCreateUserResult> execute() async {
  final payload = _payload();

  int attempt = 0;
  Object? lastError;

  while (attempt <= maxRetries) {
    try {
      final res = await httpClient.send(
        service: 'cognito-idp',
        target: 'AWSCognitoIdentityProviderService.AdminCreateUser',
        region: region,
        payload: payload,
        timeout: requestTimeout,
        headers: const {'Content-Type': 'application/x-amz-json-1.1'},
      );

      if (res.statusCode == 200) {
        Map<String, dynamic>? body;
        try {
          body = res.bodyString.isEmpty
              ? null
              : (json.decode(res.bodyString) as Map<String, dynamic>);
        } catch (_) {
          body = null;
        }
        return CognitoAdminCreateUserResult(body);
      }

      if (res.statusCode >= 400 && res.statusCode < 500) {
        throw CognitoServiceException(
          'AdminCreateUser failed. Body: ${res.bodyString}',
          statusCode: res.statusCode,
        );
      }

      if (res.statusCode >= 500) {
        throw CognitoServiceException(
          'AdminCreateUser temporary failure.',
          statusCode: res.statusCode,
        );
      }

      throw CognitoServiceException(
        'AdminCreateUser unexpected status.',
        statusCode: res.statusCode,
      );
    } catch (e) {
      lastError = e;
      final transient = _isTransient(e);
      if (!transient || attempt == maxRetries) break;
      await Future<void>.delayed(Duration(milliseconds: 200 * (attempt + 1)));
    } finally {
      attempt++;
    }
  }

  throw CognitoServiceException(
    'AdminCreateUser failed after retries. Last error: $lastError',
  );
}