forked from fluttercommunity/flutter_launcher_icons
/
icon_generator.dart
112 lines (97 loc) · 3.2 KB
/
icon_generator.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import 'dart:io';
import 'package:flutter_launcher_icons/flutter_launcher_icons_config.dart';
import 'package:flutter_launcher_icons/logger.dart';
/// A base class to generate icons
abstract class IconGenerator {
/// Contains config
final IconGeneratorContext context;
/// Name of the platform this [IconGenerator] is created for.
final String platformName;
/// Creates a instance of [IconGenerator].
///
/// A [context] is created and provided by [generateIconsFor],
/// [platformName] takes the name of the platform that this [IconGenerator]
/// is implemented for
///
/// Also Refer
/// - [WebIconGenerator] generate icons for web
/// - [generateIconFor] generates icons for given platform
IconGenerator(this.context, this.platformName);
/// Creates icons for this platform.
void createIcons();
/// Should return `true` if this platform
/// has all the requirements to create icons.
/// This runs before to [createIcons]
bool validateRequirements();
}
/// Provides easy access to user arguments and configuration
class IconGeneratorContext {
/// Contains configuration from configuration file
final FlutterLauncherIconsConfig config;
/// A logger
final FLILogger logger;
/// Value of `--prefix` flag
final String prefixPath;
/// Value of `--flavor` flag
final String? flavor;
/// Creates an instance of [IconGeneratorContext]
IconGeneratorContext({
required this.config,
required this.logger,
required this.prefixPath,
this.flavor,
});
/// Shortcut for `config.webConfig`
WebConfig? get webConfig => config.webConfig;
/// Shortcut for `config.windowsConfig`
WindowsConfig? get windowsConfig => config.windowsConfig;
}
/// Generates Icon for given platforms
void generateIconsFor({
required FlutterLauncherIconsConfig config,
required String? flavor,
required String prefixPath,
required FLILogger logger,
required List<IconGenerator> Function(IconGeneratorContext context) platforms,
}) {
try {
final platformList = platforms(IconGeneratorContext(
config: config,
logger: logger,
prefixPath: prefixPath,
flavor: flavor,
));
if (platformList.isEmpty) {
// ? maybe we can print help
logger.info('No platform provided');
}
for (final platform in platformList) {
final progress = logger.progress('Creating Icons for ${platform.platformName}');
logger.verbose('Validating platform requirements for ${platform.platformName}');
// in case a platform throws an exception it should not effect other platforms
try {
if (!platform.validateRequirements()) {
logger.error('Requirements failed for platform ${platform.platformName}. Skipped');
progress.cancel();
continue;
}
platform.createIcons();
progress.finish(message: 'done', showTiming: true);
} catch (e, st) {
progress.cancel();
logger
..error(e.toString())
..verbose(st);
continue;
}
}
} catch (e, st) {
// todo: better error handling
// stacktrace should only print when verbose is turned on
// else a normal help line
logger
..error(e.toString())
..verbose(st);
exit(1);
}
}