import 'dart:convert'; import 'dart:io'; import 'package:args/args.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'gen_grammar.freezed.dart'; part 'gen_grammar.g.dart'; @freezed class Type with _$Type { const factory Type({ required String type, required bool named, @Default({}) Map fields, Field? children, @Default([]) List subtypes, }) = _Type; factory Type.fromJson(Map map) => _$TypeFromJson(map); } @freezed class Field with _$Field { const factory Field({ required bool multiple, required bool required, @Default([]) List types, }) = _Field; factory Field.fromJson(Map map) => _$FieldFromJson(map); } final genParser = ArgParser() ..addOption('input', abbr: 'i', help: 'Grammar\'s Node Types file', mandatory: true) ..addOption('output', abbr: 'o', help: 'Output file'); final parser = ArgParser()..addCommand('gen', genParser); Future main(List args) async { final results = parser.parse(args); final input = results.command!['input'] as String; final j = json.decode(File(input).readAsStringSync()); final result = (j as List) .map((d) => Type.fromJson(d as Map)) .toList(); print(result); final output = results.command?['output'] as String? ?? 'lib/src/grammar.dart'; }