Created
July 2, 2023 06:45
-
-
Save michaelnabil230/9722148ead5b903c4fe6274fbf972834 to your computer and use it in GitHub Desktop.
create_class_for_asset_generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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