| import 'dart:io'; | |
| import 'dart:typed_data'; | |
| import 'package:path/path.dart' as p; | |
| Future<void> main(List<String> args) async { | |
| final tzDataPath = args[0]; | |
| final dartLibraryPath = args[1]; | |
| final timezoneVersion = args[2]; | |
| final bytes = File(tzDataPath).readAsBytesSync(); | |
| final generatedDartFile = generateDartFile( | |
| name: p.basenameWithoutExtension(tzDataPath), | |
| data: bytes, | |
| tzVersion: timezoneVersion, | |
| ); | |
| File(dartLibraryPath).writeAsStringSync(generatedDartFile); | |
| } | |
| String bytesAsString( | |
| Uint8List bytes, { | |
| String prefix = '', | |
| String indent = '', | |
| }) { | |
| final buffer = StringBuffer(); | |
| buffer.write('\''); | |
| var column = prefix.length + 1; | |
| for (var index = 0; index < bytes.length; index++) { | |
| final byte = bytes[index]; | |
| if (column > 74) { | |
| // Not space for one encoding + "';". | |
| buffer | |
| ..write('\'\n') | |
| ..write(indent) | |
| ..write('\''); | |
| column = indent.length + 1; | |
| } | |
| buffer | |
| ..write(byte < 16 ? r'\x0' : r'\x') | |
| ..write(byte.toRadixString(16)); | |
| column += 4; | |
| } | |
| buffer.write('\''); | |
| return buffer.toString(); | |
| } | |
| String generateDartFile({ | |
| required String name, | |
| required Uint8List data, | |
| required String tzVersion, | |
| }) => | |
| ''' | |
| // This is a generated file. Do not edit. | |
| // Timezone data version: $tzVersion | |
| import 'dart:typed_data'; | |
| import '../src/env.dart'; | |
| import '../src/exceptions.dart'; | |
| /// Initialize Time Zone database from $name. | |
| /// | |
| /// Throws [TimeZoneInitException] when something is wrong. | |
| void initializeTimeZones() { | |
| try { | |
| initializeDatabase( | |
| Uint8List.fromList(_embeddedData.codeUnits)); | |
| } | |
| // ignore: avoid_catches_without_on_clauses | |
| catch (e) { | |
| throw TimeZoneInitException(e.toString()); | |
| } | |
| } | |
| const _embeddedData = ${bytesAsString(data, prefix: 'const _embeddedData = ', indent: ' ')}; | |
| '''; |