-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathDoctor.kt
More file actions
44 lines (35 loc) · 1.49 KB
/
Doctor.kt
File metadata and controls
44 lines (35 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ftl.doctor
import com.google.common.annotations.VisibleForTesting
import ftl.args.ArgsHelper
import ftl.args.IArgsCompanion
import java.io.Reader
import java.nio.file.Files
import java.nio.file.Path
object Doctor {
fun validateYaml(args: IArgsCompanion, data: Path): String {
if (!data.toFile().exists()) return "Skipping yaml validation. No file at path $data"
return validateYaml(args, Files.newBufferedReader(data))
}
@VisibleForTesting
internal fun validateYaml(args: IArgsCompanion, data: Reader): String {
var result = ""
val parsed = ArgsHelper.yamlMapper.readTree(data)
val validArgs = args.validArgs
val parsedArgs = mutableMapOf<String, List<String>>()
for (child in parsed.fields()) {
val key = child.key
val values = mutableListOf<String>()
child.value.fields().forEach { values.add(it.key) }
parsedArgs[key] = values
}
val unknownTopLevelKeys = parsedArgs.keys - validArgs.keys
if (unknownTopLevelKeys.isNotEmpty()) result += "Unknown top level keys: $unknownTopLevelKeys\n"
validArgs.forEach { (topLevelKey, keyList) ->
val parsedKeys = mutableListOf<String>()
parsed[topLevelKey]?.fields()?.forEach { parsedKeys.add(it.key) }
val unknownKeys = parsedKeys - keyList
if (unknownKeys.isNotEmpty()) result += "Unknown keys in $topLevelKey -> $unknownKeys\n"
}
return result
}
}