blob: 2a647e5378661968eab48c3dd657d95634bc23d1 [file] [log] [blame]
// 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('-', '_');
}
}