| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:yaml/yaml.dart'; | |
| class FileParser { | |
| Map<String, Object?> parse( | |
| String fileContents, { | |
| Uri? sourceUrl, | |
| }) { | |
| final parsedYaml = loadYaml( | |
| fileContents, | |
| sourceUrl: sourceUrl, | |
| ); | |
| if (parsedYaml is! Map) { | |
| throw const FormatException( | |
| 'YAML config must be set of key value pairs.'); | |
| } | |
| return parseToplevelMap(parsedYaml); | |
| } | |
| Map<String, Object?> parseToplevelMap(Map<dynamic, dynamic> input) { | |
| final result = <String, Object?>{}; | |
| for (final entry in input.entries) { | |
| final key = parseToplevelKey(entry.key); | |
| final value = entry.value as Object?; | |
| result[key] = value; | |
| } | |
| return result; | |
| } | |
| static final _keyRegex = RegExp('([a-z-_]+)'); | |
| String parseToplevelKey(Object? key) { | |
| if (key is! String) { | |
| throw FormatException("Key '$key' is not a String."); | |
| } | |
| final match = _keyRegex.matchAsPrefix(key); | |
| if (match == null || match.group(0) != key) { | |
| throw FormatException("Define '$key' does not match expected pattern " | |
| "'${_keyRegex.pattern}'."); | |
| } | |
| return key.replaceAll('-', '_'); | |
| } | |
| } |