Skip to content

Instantly share code, notes, and snippets.

@michaelnabil230
Created July 2, 2023 06:45
Show Gist options
  • Select an option

  • Save michaelnabil230/9722148ead5b903c4fe6274fbf972834 to your computer and use it in GitHub Desktop.

Select an option

Save michaelnabil230/9722148ead5b903c4fe6274fbf972834 to your computer and use it in GitHub Desktop.
create_class_for_asset_generator
import 'dart:developer';
import 'dart:io';
import 'package:args/args.dart';
void main(List<String> args) {
if (_isHelpCommand(args)) {
_printHelpMessage();
} else {
generateAssetClasses(_parseGenerateOptions(args));
}
}
bool _isHelpCommand(List<String> args) {
return args.length == 1 && (args[0] == '--help' || args[0] == '-h');
}
void _printHelpMessage() {
var parser = _generateArgParser(null);
log(parser.usage);
}
GenerateOptions _parseGenerateOptions(List<String> args) {
var generateOptions = GenerateOptions();
var parser = _generateArgParser(generateOptions);
parser.parse(args);
return generateOptions;
}
ArgParser _generateArgParser(GenerateOptions? generateOptions) {
var parser = ArgParser();
parser.addOption(
'source-dir',
abbr: 'S',
defaultsTo: 'assets',
callback: (String? x) => generateOptions!.sourceDir = x!,
help: 'Specifies the folder containing your assets files',
);
parser.addOption(
'output-dir',
abbr: 'O',
defaultsTo: 'lib/asset_generated',
callback: (String? x) => generateOptions!.outputDir = x,
help: 'Specifies the output folder for the generated files',
);
parser.addMultiOption(
'ignore-path',
abbr: 'I',
defaultsTo: [],
callback: (List<String> x) => generateOptions!.ignoreDir = x,
help: 'Specifies the path to ignore',
);
return parser;
}
class GenerateOptions {
late String sourceDir;
String? outputDir;
List<String>? ignoreDir;
@override
String toString() =>
'GenerateOptions(sourceDir: $sourceDir, outputDir: $outputDir, ignoreDir: $ignoreDir)';
}
void generateAssetClasses(GenerateOptions generateOptions) {
final directory = Directory(generateOptions.sourceDir);
final folders = directory.listSync(recursive: true).whereType<Directory>();
for (var folder in folders) {
if (generateOptions.ignoreDir != null &&
generateOptions.ignoreDir!.contains(folder.path)) {
continue;
}
final folderName = folder.path.split(Platform.pathSeparator).last;
final className =
'${folderName[0].toUpperCase()}${folderName.substring(1)}';
final buffer = StringBuffer();
buffer.writeln('class $className {');
final files = folder.listSync().whereType<File>().toList();
for (var file in files) {
final filePath = file.path;
final fileName = filePath.split(Platform.pathSeparator).last;
final variableName = convertToCamelCase(
fileName.replaceAll('-', '_').replaceAll(RegExp(r'\..*'), ''));
buffer.writeln(' static const String $variableName = \'$filePath\';');
}
buffer.writeln('}');
final outputFile = File('${generateOptions.outputDir}/${folderName}.dart');
outputFile.createSync(recursive: true);
outputFile.writeAsStringSync(buffer.toString());
print(
'Generated asset class for $folderName at ${outputFile.path} successfully.');
}
}
String convertToCamelCase(String input) {
final words = input.split('_');
final result = StringBuffer(words[0].toLowerCase());
for (var i = 1; i < words.length; i++) {
result.write(words[i][0].toUpperCase());
result.write(words[i].substring(1).toLowerCase());
}
return result.toString();
}
String getFolderPath(Directory directory) {
final parent = directory.parent;
if (parent.path == '.') {
return '';
}
return '${getFolderPath(parent)}${Platform.pathSeparator}${directory.path.split(Platform.pathSeparator).last}';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment