diff --git a/yaml/shared/src/main/scala/org/virtuslab/yaml/Node.scala b/yaml/shared/src/main/scala/org/virtuslab/yaml/Node.scala index e3d07149..3ccd61db 100644 --- a/yaml/shared/src/main/scala/org/virtuslab/yaml/Node.scala +++ b/yaml/shared/src/main/scala/org/virtuslab/yaml/Node.scala @@ -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 diff --git a/yaml/shared/src/main/scala/org/virtuslab/yaml/syntax/NodeVisitor.scala b/yaml/shared/src/main/scala/org/virtuslab/yaml/syntax/NodeVisitor.scala index 0603f2bd..dfd0ae0e 100644 --- a/yaml/shared/src/main/scala/org/virtuslab/yaml/syntax/NodeVisitor.scala +++ b/yaml/shared/src/main/scala/org/virtuslab/yaml/syntax/NodeVisitor.scala @@ -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.* @@ -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 { @@ -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)) +} diff --git a/yaml/shared/src/test/scala/org/virtuslab/yaml/travers/NodeVisitorSuite.scala b/yaml/shared/src/test/scala/org/virtuslab/yaml/travers/NodeVisitorSuite.scala index 4235fc93..a4027bbf 100644 --- a/yaml/shared/src/test/scala/org/virtuslab/yaml/travers/NodeVisitorSuite.scala +++ b/yaml/shared/src/test/scala/org/virtuslab/yaml/travers/NodeVisitorSuite.scala @@ -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 = @@ -39,7 +45,7 @@ class NodeVisitorSuite extends munit.FunSuite { | ports: | - 6000:6000 | redis: - | image: redis:alpine + | image: openjdk:11 |""".stripMargin assertEquals(modifiedYaml, exptectedYaml)