/
search.dart
76 lines (65 loc) · 2 KB
/
search.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import 'dart:io';
import 'dart:math';
import 'package:mason/mason.dart' hide packageVersion, Brick;
import 'package:mason_api/mason_api.dart';
import 'package:mason_cli/src/command.dart';
/// {@template logout_command}
/// `mason search` command which searches registered bricks on `brickhub.dev`.
/// {@endtemplate}
class SearchCommand extends MasonCommand {
/// {@macro logout_command}
SearchCommand({Logger? logger, MasonApi? masonApi})
: _masonApi = masonApi ?? MasonApi(),
super(logger: logger);
final MasonApi _masonApi;
@override
final String description = 'Search published bricks on brickhub.dev.';
@override
final String name = 'search';
@override
Future<int> run() async {
if (results.rest.isEmpty) usageException('search term is required.');
final query = results.rest.first;
final searchProgress = logger.progress(
'Searching "$query" on brickhub.dev',
);
try {
final results = await _masonApi.search(query: query);
searchProgress.complete(
results.isEmpty
? 'No bricks found.'
: '''Found ${results.length} brick${results.length == 1 ? '' : 's'}.''',
);
logger.info('');
for (final brick in results) {
final brickLink = styleUnderlined.wrap(
link(
uri: Uri.parse(
'https://brickhub.dev/bricks/${brick.name}/${brick.version}',
),
),
);
logger
..info(
lightCyan.wrap(styleBold.wrap('${brick.name} v${brick.version}')),
)
..info(brick.description)
..info(brickLink)
..info(darkGray.wrap('-' * _separatorLength()));
}
return ExitCode.success.code;
} catch (error) {
searchProgress.fail();
logger.err('$error');
return ExitCode.software.code;
}
}
}
int _separatorLength() {
const maxSeparatorLength = 80;
try {
return min(stdout.terminalColumns, maxSeparatorLength);
} catch (_) {
return maxSeparatorLength;
}
}