Skip to content

Commit 3947038

Browse files
author
serverpod_cloud
committed
refactor: a8910e1525d427fb80446788bf16033d52e1ca54
1 parent 4527166 commit 3947038

34 files changed

Lines changed: 528 additions & 586 deletions

serverpod_cloud_cli/bin/serverpod_cloud_cli.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'dart:io';
44
import 'package:cli_tools/cli_tools.dart';
55
import 'package:serverpod_cloud_cli/command_logger/command_logger.dart';
66
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command_runner.dart';
7-
import 'package:serverpod_cloud_cli/command_runner/exit_exceptions.dart';
7+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
88
import 'package:serverpod_cloud_cli/util/scloud_version.dart';
99

1010
void main(final List<String> args) async {

serverpod_cloud_cli/lib/command_logger/command_logger.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ class CommandLogger {
175175
_logger.error(
176176
msg,
177177
newParagraph: newParagraph,
178-
stackTrace: stackTrace,
178+
stackTrace: configuration?.verbose == true ? stackTrace : null,
179179
);
180180

181181
if (hint != null) {

serverpod_cloud_cli/lib/command_runner/cloud_cli_command.dart

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import 'package:cli_tools/cli_tools.dart';
44
import 'package:serverpod_cloud_cli/command_logger/command_logger.dart';
55
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command_runner.dart';
66
import 'package:serverpod_cloud_cli/shared/exceptions/cloud_cli_usage_exception.dart';
7+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
8+
import 'package:serverpod_cloud_cli/shared/helpers/common_exceptions_handler.dart'
9+
show processCommonClientExceptions;
710
import 'package:serverpod_cloud_cli/util/cli_authentication_key_manager.dart';
811
import 'package:serverpod_cloud_cli/util/scloud_config/scloud_config_broker.dart'
912
show scloudCliConfigBroker;
1013

11-
import 'exit_exceptions.dart';
12-
1314
abstract class CloudCliCommand<O extends OptionDefinition>
1415
extends BetterCommand<O, void> {
1516
final CommandLogger logger;
@@ -67,12 +68,55 @@ abstract class CloudCliCommand<O extends OptionDefinition>
6768

6869
try {
6970
await super.run();
71+
} on FailureException catch (e, stackTrace) {
72+
_processFailureException(e, stackTrace);
7073
} on CloudCliUsageException catch (e, stackTrace) {
7174
// TODO: Don't catch CloudCliUsageException,
7275
// it's a UsageException and is handled by the caller.
7376
logger.error(e.message, hint: e.hint);
7477
throw ErrorExitException(e.message, e, stackTrace);
78+
} on UsageException catch (_) {
79+
rethrow;
80+
} on ErrorExitException catch (_) {
81+
rethrow;
82+
} on Exception catch (e, stackTrace) {
83+
processCommonClientExceptions(logger, e, stackTrace);
84+
logger.error(
85+
'Error when running command `$name`',
86+
exception: e,
87+
stackTrace: stackTrace,
88+
);
89+
throw ErrorExitException(e.toString(), e, stackTrace);
90+
}
91+
}
92+
93+
/// Process a [FailureException] by displaying relevant messages to the user
94+
/// and throw an [ErrorExitException].
95+
Never _processFailureException(
96+
final FailureException e,
97+
final StackTrace stackTrace,
98+
) {
99+
final nested = e.nestedException;
100+
if (nested != null) {
101+
processCommonClientExceptions(logger, nested, stackTrace);
75102
}
103+
104+
if (e.errors.isNotEmpty) {
105+
logger.error(
106+
e.errors.join('\n'),
107+
hint: e.hint,
108+
exception: nested,
109+
stackTrace: stackTrace,
110+
);
111+
} else if (e.hint case final String hint) {
112+
logger.log(
113+
hint,
114+
level: LogLevel.info,
115+
type: TextLogType.hint,
116+
);
117+
}
118+
119+
throw ErrorExitException(e.reason, e.nestedException, e.nestedStackTrace);
76120
}
77121

78122
@override

serverpod_cloud_cli/lib/command_runner/cloud_cli_command_runner.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import 'package:serverpod_cloud_cli/command_runner/commands/project_command.dart
1717
import 'package:serverpod_cloud_cli/command_runner/commands/secret_command.dart';
1818
import 'package:serverpod_cloud_cli/command_runner/commands/status_command.dart';
1919
import 'package:serverpod_cloud_cli/command_runner/commands/version_command.dart';
20-
import 'package:serverpod_cloud_cli/command_runner/exit_exceptions.dart';
20+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
2121
import 'package:serverpod_cloud_cli/command_runner/helpers/cloud_cli_service_provider.dart';
2222
import 'package:serverpod_cloud_cli/command_runner/helpers/cli_version_checker.dart';
2323
import 'package:serverpod_cloud_cli/constants.dart';
@@ -385,6 +385,10 @@ class GlobalConfiguration extends Configuration<GlobalOption> {
385385
super.env,
386386
}) : super.resolve(options: GlobalOption.values);
387387

388+
bool get quiet => value(GlobalOption.quiet);
389+
390+
bool get verbose => value(GlobalOption.verbose);
391+
388392
bool get version => value(GlobalOption.version);
389393

390394
Directory get scloudDir => value(GlobalOption.scloudDir);

serverpod_cloud_cli/lib/command_runner/commands/auth_command.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'dart:async';
22

33
import 'package:cli_tools/config.dart';
44
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command.dart';
5-
import 'package:serverpod_cloud_cli/command_runner/exit_exceptions.dart';
5+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
66
import 'package:serverpod_cloud_cli/persistent_storage/models/serverpod_cloud_data.dart';
77
import 'package:serverpod_cloud_cli/persistent_storage/resource_manager.dart';
88
import 'package:serverpod_cloud_cli/util/browser_launcher.dart';
@@ -105,7 +105,7 @@ class CloudLoginCommand extends CloudCliCommand<LoginCommandOption> {
105105
logger.terminalCommand(
106106
'scloud auth logout',
107107
);
108-
throw ErrorExitException();
108+
throw FailureException();
109109
}
110110

111111
final cloudServer = Uri.parse(serverAddress).replace(
@@ -146,12 +146,10 @@ class CloudLoginCommand extends CloudCliCommand<LoginCommandOption> {
146146

147147
final token = await tokenFuture;
148148
if (token == null) {
149-
logger.error(
150-
'Failed to get authentication token.',
149+
throw FailureException(
150+
error: 'Failed to get authentication token.',
151151
hint: 'Please try to log in again.',
152152
);
153-
154-
throw ErrorExitException();
155153
}
156154

157155
if (persistent) {

serverpod_cloud_cli/lib/command_runner/commands/custom_domain_command.dart

Lines changed: 35 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import 'package:basic_utils/basic_utils.dart';
22
import 'package:cli_tools/config.dart';
33
import 'package:serverpod_cloud_cli/command_logger/command_logger.dart';
44
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command.dart';
5-
import 'package:serverpod_cloud_cli/command_runner/exit_exceptions.dart';
5+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
66
import 'package:serverpod_cloud_cli/command_runner/helpers/command_options.dart';
7-
import 'package:serverpod_cloud_cli/shared/helpers/common_exceptions_handler.dart';
87
import 'package:serverpod_cloud_cli/util/printers/table_printer.dart';
98
import 'package:ground_control_client/ground_control_client.dart';
109

@@ -106,36 +105,27 @@ The valid targets are:
106105

107106
late CustomDomainNameWithDefaultDomains customDomainNameWithDefaultDomains;
108107

109-
await handleCommonClientExceptions(
110-
logger,
111-
() async {
112-
customDomainNameWithDefaultDomains =
113-
await apiCloudClient.customDomainName.add(
114-
domainName: domainName,
115-
target: target,
116-
cloudCapsuleId: projectId,
117-
);
118-
},
119-
(final e) {
120-
logger.error(
121-
'Could not add the custom domain',
122-
exception: e,
123-
);
124-
125-
throw ErrorExitException();
126-
},
127-
);
108+
try {
109+
customDomainNameWithDefaultDomains =
110+
await apiCloudClient.customDomainName.add(
111+
domainName: domainName,
112+
target: target,
113+
cloudCapsuleId: projectId,
114+
);
115+
} on Exception catch (e, stackTrace) {
116+
throw FailureException.nested(
117+
e, stackTrace, 'Could not add the custom domain');
118+
}
128119

129120
logger.success('Custom domain added successfully!', newParagraph: true);
130121

131122
final targetDefaultDomain =
132123
customDomainNameWithDefaultDomains.defaultDomainsByTarget[target];
133124

134125
if (targetDefaultDomain == null) {
135-
logger.error(
136-
'Could not find the target domain for "$target".',
126+
throw FailureException(
127+
error: 'Could not find the target domain for "$target".',
137128
);
138-
throw ErrorExitException();
139129
}
140130

141131
if (DomainUtils.isSubDomain(domainName)) {
@@ -252,18 +242,14 @@ class CloudListCustomDomainCommand
252242
final apiCloudClient = runner.serviceProvider.cloudApiClient;
253243

254244
late CustomDomainNameList domainNamesList;
255-
await handleCommonClientExceptions(logger, () async {
245+
try {
256246
domainNamesList = await apiCloudClient.customDomainName.list(
257247
cloudCapsuleId: projectId,
258248
);
259-
}, (final e) {
260-
logger.error(
261-
'Failed to list custom domains',
262-
exception: e,
263-
);
264-
265-
throw ErrorExitException();
266-
});
249+
} on Exception catch (e, stackTrace) {
250+
throw FailureException.nested(
251+
e, stackTrace, 'Failed to list custom domains');
252+
}
267253

268254
final defaultDomainPrinter = TablePrinter();
269255
defaultDomainPrinter.addHeaders(['Default domain name', 'Target']);
@@ -338,24 +324,20 @@ class CloudRemoveCustomDomainCommand
338324
);
339325

340326
if (!shouldDelete) {
341-
throw ErrorExitException();
327+
throw UserAbortException();
342328
}
343329

344330
final apiCloudClient = runner.serviceProvider.cloudApiClient;
345331

346-
await handleCommonClientExceptions(logger, () async {
332+
try {
347333
await apiCloudClient.customDomainName.remove(
348334
cloudCapsuleId: projectId,
349335
domainName: domainName,
350336
);
351-
}, (final e) {
352-
logger.error(
353-
'Failed to remove custom domain',
354-
exception: e,
355-
);
356-
357-
throw ErrorExitException();
358-
});
337+
} on Exception catch (e, stackTrace) {
338+
throw FailureException.nested(
339+
e, stackTrace, 'Failed to remove custom domain');
340+
}
359341

360342
logger.success('Successfully removed custom domain: $domainName.');
361343
}
@@ -393,7 +375,7 @@ class CloudVerifyCustomDomainRecordCommand
393375

394376
final apiCloudClient = runner.serviceProvider.cloudApiClient;
395377

396-
await handleCommonClientExceptions(logger, () async {
378+
try {
397379
final result = await apiCloudClient.customDomainName.refreshRecord(
398380
cloudCapsuleId: projectId,
399381
domainName: domainName,
@@ -413,20 +395,17 @@ class CloudVerifyCustomDomainRecordCommand
413395
}
414396

415397
return;
416-
}, (final e) {
417-
if (e is DNSVerificationFailedException) {
418-
logger.error(
419-
'Failed to verify the DNS record for the custom domain: ${e.message}',
420-
);
421-
return;
422-
}
423-
398+
} on DNSVerificationFailedException catch (e) {
424399
logger.error(
400+
'Failed to verify the DNS record for the custom domain: ${e.message}',
401+
);
402+
return;
403+
} on Exception catch (e, stackTrace) {
404+
throw FailureException.nested(
405+
e,
406+
stackTrace,
425407
'Failed to refresh custom domain record',
426-
exception: e,
427408
);
428-
429-
throw ErrorExitException();
430-
});
409+
}
431410
}
432411
}

0 commit comments

Comments
 (0)