diff --git a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala index 26a59ba15..fa7665c1e 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -110,12 +110,9 @@ object YamlDecoder: } } - given [T](using c: YamlDecoder[T]): YamlDecoder[Option[T]] = YamlDecoder { - case ScalarNode(value, tag) => - value match - case _ if tag == Tag.nullTag => Right(None) - case _ => - c.construct(ScalarNode(value)).map(Option(_)) + given [T](using c: YamlDecoder[T]): YamlDecoder[Option[T]] = YamlDecoder { node => + if node.tag == Tag.nullTag then Right(None) + else c.construct(node).map(Option(_)) } private def constructFromNodes[T](nodes: Seq[Node])(using diff --git a/core/shared/src/test/scala/org/virtuslab/yaml/decoder/DecoderSuite.scala b/core/shared/src/test/scala/org/virtuslab/yaml/decoder/DecoderSuite.scala index 2e85cccd3..508a1500b 100644 --- a/core/shared/src/test/scala/org/virtuslab/yaml/decoder/DecoderSuite.scala +++ b/core/shared/src/test/scala/org/virtuslab/yaml/decoder/DecoderSuite.scala @@ -328,3 +328,15 @@ class DecoderSuite extends munit.FunSuite: assertEquals(yaml.as[Any], Right(expected)) } + + test("option") { + case class Foo(int: Int, string: String) derives YamlCodec + + val foo = + """|- int: 1 + | string: "1" + |- !!null + |""".stripMargin.as[List[Option[Foo]]] + + assertEquals(foo, Right(List(Some(Foo(1, "1")), None))) + }