run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  final resendEmail = argResults!['resend'] as String?;
  if (resendEmail != null) {
    await _resend(resendEmail);
    return;
  }

  final acceptFlag = argResults!['accept-terms'] as bool;
  final refusal = TermsAcceptance.refusalMessage(
    hasTerminal: stdin.hasTerminal,
    acceptFlag: acceptFlag,
  );
  if (refusal != null) {
    AppLogger.error(refusal);
    exit(ExitCodes.usage);
  }

  if (!acceptFlag) {
    stdout.writeln(TermsAcceptance.promptText());
    stdout.write(TermsAcceptance.question);
    final answer = stdin.readLineSync() ?? '';
    if (!TermsAcceptance.isYes(answer)) {
      AppLogger.info('Cancelled.');
      return;
    }
  }

  final fullName = _prompt('Full name: ');
  final email = _prompt('Email: ');
  final password = _promptPassword('Password: ');
  final confirmation = _promptPassword('Confirm password: ');

  for (final error in [
    validateFullName(fullName),
    validateEmail(email),
    validatePassword(password),
    validateConfirmation(password, confirmation),
  ]) {
    if (error != null) {
      AppLogger.error(error);
      exit(ExitCodes.usage);
    }
  }

  AppLogger.info('Creating your account…');
  try {
    await SignupService.ins.signup(
      apiDio: _plainDio(),
      auth: AuthRestClient(),
      email: email,
      password: password,
      fullName: fullName,
    );

    CliAnalytics.ins.logSignupCompleted();
    AppLogger.success(successMessage(email: email));
  } on AuthCliFault catch (e) {
    AppLogger.error(e.message);
    exit(e.exitCode);
  } on DioException catch (e) {
    AppLogger.error('Network error: ${e.message}');
    exit(ExitCodes.usage);
  }
}