Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package xyz.fancystuff.pluvius.runtime
- object OverlayParser {
- fun parse(rawList: List<String>) = rawList
- .map { toSyntaxToken(it) }
- .fold(listOf<OverlaySyntaxToken>()) { acc, item -> foldToList(acc, item) }
- .map { it as OverlayItem }
- private fun toSyntaxToken(line: String): OverlaySyntaxToken = when {
- line.isBlank() -> BlankLine
- isGroupItem(line) -> OverlayGroupItem(line)
- else -> OverlayItem(name = getOverlayPackageFromLine(line), isEnabled = isOverlayEnabled(line))
- }
- private fun foldToList(acc: List<OverlaySyntaxToken>, item: OverlaySyntaxToken) = when(item) {
- BlankLine -> acc // do not add blankLine
- is OverlayGroupItem -> listOf(*acc.toTypedArray(), item) // add header
- is OverlayItem -> { //inject groupName to a item and remove previous object if it is a GroupItem
- val prevItem = acc.last()
- when(prevItem) {
- is OverlayGroupItem -> listWithLastItemReplaced(acc, OverlayItem(prevItem.group, item.name, item.isEnabled))
- is OverlayItem -> listWithItemAdded(acc, OverlayItem(prevItem.group, item.name, item.isEnabled))
- else -> acc
- }
- }
- }
- private fun listWithItemAdded(acc: List<OverlaySyntaxToken>, item: OverlaySyntaxToken): List<OverlaySyntaxToken> {
- return listOf(*acc.toTypedArray(), item) //adding new item
- }
- private fun listWithLastItemReplaced(acc: List<OverlaySyntaxToken>, item: OverlaySyntaxToken): List<OverlaySyntaxToken> {
- val list = acc.subList(0, acc.size - 1) //removing last item
- return listOf(*list.toTypedArray(), item) //adding new item
- }
- private fun isGroupItem(line: String) = !line.startsWith("[")
- private fun isOverlayEnabled(overlay: String) = overlay.contains("[x]")
- private fun getOverlayPackageFromLine(line: String) = line.substring(4)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement