Skip to content

Commit

Permalink
Allow nested modify
Browse files Browse the repository at this point in the history
  • Loading branch information
lwronski committed Nov 16, 2021
1 parent 01631d5 commit 58be88a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
6 changes: 6 additions & 0 deletions yaml/shared/src/main/scala/org/virtuslab/yaml/Node.scala
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,10 @@ object Node:
pos: Option[Range] = None
) extends Node

extension (either: Either[TraverseError, Node])
def modify(index: Int): Either[TraverseError, NodeVisitor] = either.map(_.modify(index))

extension (either: Either[TraverseError, Node])
def modify(field: String): Either[TraverseError, NodeVisitor] = either.map(_.modify(field))

end Node
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.virtuslab.yaml.syntax

import org.virtuslab.yaml.{Node, Range, TraverseError}
import org.virtuslab.yaml.{Node, Range, TraverseError, YamlError}
import org.virtuslab.yaml.Node.*
import org.virtuslab.yaml.syntax.NodeSelector.*

Expand Down Expand Up @@ -48,7 +48,7 @@ case class NodeVisitor(node: Node, selectors: List[NodeSelector]):
case _ => Left(TraverseError(s"Expeceted index of sequence, insted found end of path"))
}

def updateMappingNode(value: String, mappings: Seq[KeyValueNode], pos: Option[Range]) = {
private def updateMappingNode(value: String, mappings: Seq[KeyValueNode], pos: Option[Range]) = {
selectors match {
case StringSelector(field) :: rest =>
val updatedKeyIndex = mappings.indexWhere {
Expand Down Expand Up @@ -91,4 +91,14 @@ case class NodeVisitor(node: Node, selectors: List[NodeSelector]):
case MappingNode(mappings, pos) => updateMappingNode(value, mappings, pos)
}

object NodeVisitor
object NodeVisitor {

extension (either: Either[TraverseError, NodeVisitor])
def apply(field: String): Either[TraverseError, NodeVisitor] = either.map(_.apply(field))

extension (either: Either[TraverseError, NodeVisitor])
def apply(index: Int): Either[TraverseError, NodeVisitor] = either.map(_.apply(index))

extension (either: Either[TraverseError, NodeVisitor])
def setValue(value: String): Either[TraverseError, Node] = either.flatMap(_.setValue(value))
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ class NodeVisitorSuite extends munit.FunSuite {

val node: Node = yaml.asNode.orThrow
val modifiedNode: Node =
node.modify("services")("web")("ports")(0).setValue("6000:6000").orThrow
node
.modify("services")("web")("ports")(0)
.setValue("6000:6000")
.modify("services")("redis")("image")
.setValue("openjdk:11")
.orThrow

val modifiedYaml = modifiedNode.asYaml

val exptectedYaml =
Expand All @@ -39,7 +45,7 @@ class NodeVisitorSuite extends munit.FunSuite {
| ports:
| - 6000:6000
| redis:
| image: redis:alpine
| image: openjdk:11
|""".stripMargin

assertEquals(modifiedYaml, exptectedYaml)
Expand Down

0 comments on commit 58be88a

Please sign in to comment.