From 360546921f1582e9900f791890fe4a8e33761635 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 15:51:56 +0200 Subject: [PATCH 01/11] Reuse the existing decoders --- .../org/virtuslab/yaml/YamlDecoder.scala | 73 ++++++++++++------- 1 file changed, 48 insertions(+), 25 deletions(-) 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 d15d7211..3c7e6eb6 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -9,10 +9,17 @@ import org.virtuslab.yaml.Node._ /** * A type class that provides a conversion from a [[Node]] into given type [[T]] */ -trait YamlDecoder[T] { +trait YamlDecoder[T] { self => def construct(node: Node)(implicit settings: LoadSettings = LoadSettings.empty ): Either[ConstructError, T] + + def orElse(that: => YamlDecoder[T]): YamlDecoder[T] = new YamlDecoder[T] { + override def construct(node: Node)(implicit settings: LoadSettings): Either[ConstructError, T] = + self.construct(node) match + case Right(result) => result + case _: Left[?, ?] => that.construct(node) + } } object YamlDecoder extends YamlDecoderCompanionCrossCompat { @@ -39,57 +46,73 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { ) implicit def forInt: YamlDecoder[Int] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toIntOption.toRight(cannotParse(value, "Int", s)) + Try(java.lang.Integer.decode(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Int", s)) } implicit def forLong: YamlDecoder[Long] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toLongOption.toRight(cannotParse(value, "Long", s)) + Try(java.lang.Long.decode(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Long", s)) } implicit def forDouble: YamlDecoder[Double] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toDoubleOption.toRight(cannotParse(value, "Double", s)) + Try(java.lang.Double.parseDouble(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Double", s)) } implicit def forFloat: YamlDecoder[Float] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toFloatOption.toRight(cannotParse(value, "Float", s)) + Try(java.lang.Float.parseFloat(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Float", s)) } implicit def forShort: YamlDecoder[Short] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toShortOption.toRight(cannotParse(value, "Short", s)) + Try(java.lang.Short.decode(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Short", s)) } implicit def forByte: YamlDecoder[Byte] = YamlDecoder { case s @ ScalarNode(value, _) => - value.toByteOption.toRight(cannotParse(value, "Byte", s)) + Try(java.lang.Byte.decode(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "Byte", s)) } implicit def forBoolean: YamlDecoder[Boolean] = YamlDecoder { case s @ ScalarNode(value, _) => value.toBooleanOption.toRight(cannotParse(value, "Boolean", s)) } + implicit def forBigInt: YamlDecoder[BigInt] = YamlDecoder { case s @ ScalarNode(value, _) => + Try(BigInt(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "BigInt", s)) + } + + implicit def forBigDecimal: YamlDecoder[BigDecimal] = YamlDecoder { + case s @ ScalarNode(value, _) => + Try(BigDecimal(value.replaceAll("_", ""))).toEither.left + .map(ConstructError.from(_, "BigDecimal", s)) + } + implicit def forAny: YamlDecoder[Any] = new YamlDecoder[Any] { def construct(node: Node)(implicit settings: LoadSettings = LoadSettings.empty) = { node match { - case ScalarNode(value, tag: CoreSchemaTag) if Tag.corePrimitives.contains(tag) => + case node @ ScalarNode(value, tag: CoreSchemaTag) if Tag.corePrimitives.contains(tag) => tag match { - case Tag.nullTag => Right(None) - case Tag.boolean => value.toBooleanOption.toRight(cannotParse(value, "Boolean", node)) + case Tag.nullTag => + Right(None) + case Tag.boolean => + forBoolean.construct(node) case Tag.int => - val valueNorm = value.replaceAll("_", "") - Try(java.lang.Integer.decode(valueNorm)) - .orElse(Try(java.lang.Long.decode(valueNorm))) - .orElse(Try(BigInt(valueNorm))) - .toEither - .left - .map(t => ConstructError.from(t, "int", node)) + forByte + .orElse(forShort) + .orElse(forInt) + .orElse(forLong) + .orElse(forBigInt) + .construct(node) case Tag.float => - val valueNorm = value.replaceAll("_", "") - Try(java.lang.Float.parseFloat(valueNorm)) - .orElse(Try(java.lang.Double.parseDouble(valueNorm))) - .orElse(Try(BigDecimal(valueNorm))) - .toEither - .left - .map(t => ConstructError.from(t, "float", node)) - case Tag.str => Right(value) + forFloat + .orElse(forDouble) + .orElse(forBigDecimal) + .construct(node) + case Tag.str => + Right(value) } case MappingNode(mappings, Tag.map) => val decoder = implicitly[YamlDecoder[Map[Any, Any]]] From fac573910cc8dfecd301384b8d3cc9fb596c9b71 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 15:52:52 +0200 Subject: [PATCH 02/11] Reuse the existing decoders --- core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3c7e6eb6..76307886 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -14,7 +14,7 @@ trait YamlDecoder[T] { self => settings: LoadSettings = LoadSettings.empty ): Either[ConstructError, T] - def orElse(that: => YamlDecoder[T]): YamlDecoder[T] = new YamlDecoder[T] { + final def orElse(that: => YamlDecoder[T]): YamlDecoder[T] = new YamlDecoder[T] { override def construct(node: Node)(implicit settings: LoadSettings): Either[ConstructError, T] = self.construct(node) match case Right(result) => result From cb9e0ef8cf039d4cac800dcd037ba07008844b39 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 15:53:15 +0200 Subject: [PATCH 03/11] Reuse the existing decoders --- core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 76307886..a10b5b4e 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -18,7 +18,7 @@ trait YamlDecoder[T] { self => override def construct(node: Node)(implicit settings: LoadSettings): Either[ConstructError, T] = self.construct(node) match case Right(result) => result - case _: Left[?, ?] => that.construct(node) + case Left(_) => that.construct(node) } } From b6abcdc1fa4931544b30066f940ccf00ec56546e Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 15:58:04 +0200 Subject: [PATCH 04/11] Scala 2 --- .../shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 a10b5b4e..38cbcb9f 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -16,9 +16,10 @@ trait YamlDecoder[T] { self => final def orElse(that: => YamlDecoder[T]): YamlDecoder[T] = new YamlDecoder[T] { override def construct(node: Node)(implicit settings: LoadSettings): Either[ConstructError, T] = - self.construct(node) match + self.construct(node) match { case Right(result) => result case Left(_) => that.construct(node) + } } } From bf9188a078f5e87b6a95309b8a91fa1ae712bbc4 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:18:41 +0200 Subject: [PATCH 05/11] map --- .../org/virtuslab/yaml/YamlDecoder.scala | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) 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 38cbcb9f..2010df5b 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -14,13 +14,22 @@ trait YamlDecoder[T] { self => settings: LoadSettings = LoadSettings.empty ): Either[ConstructError, T] - final def orElse(that: => YamlDecoder[T]): YamlDecoder[T] = new YamlDecoder[T] { - override def construct(node: Node)(implicit settings: LoadSettings): Either[ConstructError, T] = + final def orElse[T1 >: T](that: => YamlDecoder[T1]): YamlDecoder[T1] = new YamlDecoder[T1] { + override def construct( + node: Node + )(implicit settings: LoadSettings): Either[ConstructError, T1] = self.construct(node) match { - case Right(result) => result - case Left(_) => that.construct(node) + case result @ Right(_) => result + case Left(_) => that.construct(node) } } + + final def map[T1](f: T => T1): YamlDecoder[T1] = new YamlDecoder[T1] { + override def construct(node: Node)(implicit + settings: LoadSettings + ): Either[ConstructError, T1] = + self.construct(node).map(f) + } } object YamlDecoder extends YamlDecoderCompanionCrossCompat { @@ -47,12 +56,12 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { ) implicit def forInt: YamlDecoder[Int] = YamlDecoder { case s @ ScalarNode(value, _) => - Try(java.lang.Integer.decode(value.replaceAll("_", ""))).toEither.left + Try(java.lang.Integer.decode(value.replaceAll("_", "")).toInt).toEither.left .map(ConstructError.from(_, "Int", s)) } implicit def forLong: YamlDecoder[Long] = YamlDecoder { case s @ ScalarNode(value, _) => - Try(java.lang.Long.decode(value.replaceAll("_", ""))).toEither.left + Try(java.lang.Long.decode(value.replaceAll("_", "")).toLong).toEither.left .map(ConstructError.from(_, "Long", s)) } @@ -67,12 +76,12 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { } implicit def forShort: YamlDecoder[Short] = YamlDecoder { case s @ ScalarNode(value, _) => - Try(java.lang.Short.decode(value.replaceAll("_", ""))).toEither.left + Try(java.lang.Short.decode(value.replaceAll("_", "")).toShort).toEither.left .map(ConstructError.from(_, "Short", s)) } implicit def forByte: YamlDecoder[Byte] = YamlDecoder { case s @ ScalarNode(value, _) => - Try(java.lang.Byte.decode(value.replaceAll("_", ""))).toEither.left + Try(java.lang.Byte.decode(value.replaceAll("_", "")).toByte).toEither.left .map(ConstructError.from(_, "Byte", s)) } @@ -102,15 +111,17 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { forBoolean.construct(node) case Tag.int => forByte - .orElse(forShort) - .orElse(forInt) - .orElse(forLong) - .orElse(forBigInt) + .map(identity[Any]) + .orElse(forShort.map(identity[Any])) + .orElse(forInt.map(identity[Any])) + .orElse(forLong.map(identity[Any])) + .orElse(forBigInt.map(identity[Any])) .construct(node) case Tag.float => forFloat - .orElse(forDouble) - .orElse(forBigDecimal) + .map(identity[Any]) + .orElse(forDouble.map(identity[Any])) + .orElse(forBigDecimal.map(identity[Any])) .construct(node) case Tag.str => Right(value) From 53d8f3c747f26d51afe11e7b4a728c93e809914b Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:25:25 +0200 Subject: [PATCH 06/11] fix --- .../scala-3/org/virtuslab/yaml/decoder/DecoderErrorsSuite.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/shared/src/test/scala-3/org/virtuslab/yaml/decoder/DecoderErrorsSuite.scala b/core/shared/src/test/scala-3/org/virtuslab/yaml/decoder/DecoderErrorsSuite.scala index 7e754910..c4f9a31b 100644 --- a/core/shared/src/test/scala-3/org/virtuslab/yaml/decoder/DecoderErrorsSuite.scala +++ b/core/shared/src/test/scala-3/org/virtuslab/yaml/decoder/DecoderErrorsSuite.scala @@ -17,7 +17,7 @@ class DecoderErrorsSuite extends BaseDecoderErrorSuite: assertError( yaml.as[Person], - s"""|Cannot parse xxx as Int + s"""|For input string: "xxx" |at 1:5, expected Int |age: xxx | ^ From 32a935bfc777fa3f74e4cb061a30391b0a2c5c99 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:40:57 +0200 Subject: [PATCH 07/11] widen --- .../org/virtuslab/yaml/YamlDecoder.scala | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 2010df5b..e09afc8f 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -24,6 +24,8 @@ trait YamlDecoder[T] { self => } } + final def widen[T1 >: T]: YamlDecoder[T1] = self.asInstanceOf[YamlDecoder[T1]] + final def map[T1](f: T => T1): YamlDecoder[T1] = new YamlDecoder[T1] { override def construct(node: Node)(implicit settings: LoadSettings @@ -110,18 +112,16 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { case Tag.boolean => forBoolean.construct(node) case Tag.int => - forByte - .map(identity[Any]) - .orElse(forShort.map(identity[Any])) - .orElse(forInt.map(identity[Any])) - .orElse(forLong.map(identity[Any])) - .orElse(forBigInt.map(identity[Any])) + forByte.widen + .orElse(forShort.widen) + .orElse(forInt.widen) + .orElse(forLong.widen) + .orElse(forBigInt.widen) .construct(node) case Tag.float => - forFloat - .map(identity[Any]) - .orElse(forDouble.map(identity[Any])) - .orElse(forBigDecimal.map(identity[Any])) + forFloat.widen + .orElse(forDouble.widen) + .orElse(forBigDecimal.widen) .construct(node) case Tag.str => Right(value) From 785e09e2afe7a31076d365199462b95779223b4d Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:43:19 +0200 Subject: [PATCH 08/11] Scala 2 --- .../scala/org/virtuslab/yaml/YamlDecoder.scala | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) 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 e09afc8f..65acf0fe 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -112,16 +112,18 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { case Tag.boolean => forBoolean.construct(node) case Tag.int => - forByte.widen - .orElse(forShort.widen) - .orElse(forInt.widen) - .orElse(forLong.widen) - .orElse(forBigInt.widen) + forByte + .widen[Any] + .orElse(forShort.widen[Any]) + .orElse(forInt.widen[Any]) + .orElse(forLong.widen[Any]) + .orElse(forBigInt.widen[Any]) .construct(node) case Tag.float => - forFloat.widen - .orElse(forDouble.widen) - .orElse(forBigDecimal.widen) + forFloat + .widen[Any] + .orElse(forDouble.widen[Any]) + .orElse(forBigDecimal.widen[Any]) .construct(node) case Tag.str => Right(value) From 1a95ad516fbcc446cc5bbab531c2177d17fcf066 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:48:25 +0200 Subject: [PATCH 09/11] exhaustive pattern match --- .../org/virtuslab/yaml/YamlDecoder.scala | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) 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 65acf0fe..b36e3408 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -105,29 +105,26 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { implicit def forAny: YamlDecoder[Any] = new YamlDecoder[Any] { def construct(node: Node)(implicit settings: LoadSettings = LoadSettings.empty) = { node match { - case node @ ScalarNode(value, tag: CoreSchemaTag) if Tag.corePrimitives.contains(tag) => - tag match { - case Tag.nullTag => - Right(None) - case Tag.boolean => - forBoolean.construct(node) - case Tag.int => - forByte - .widen[Any] - .orElse(forShort.widen[Any]) - .orElse(forInt.widen[Any]) - .orElse(forLong.widen[Any]) - .orElse(forBigInt.widen[Any]) - .construct(node) - case Tag.float => - forFloat - .widen[Any] - .orElse(forDouble.widen[Any]) - .orElse(forBigDecimal.widen[Any]) - .construct(node) - case Tag.str => - Right(value) - } + case ScalarNode(_, Tag.nullTag) => + Right(None) + case node @ ScalarNode(_, Tag.boolean) => + forBoolean.construct(node) + case node @ ScalarNode(_, Tag.int) => + forByte + .widen[Any] + .orElse(forShort.widen[Any]) + .orElse(forInt.widen[Any]) + .orElse(forLong.widen[Any]) + .orElse(forBigInt.widen[Any]) + .construct(node) + case node @ ScalarNode(_, Tag.float) => + forFloat + .widen[Any] + .orElse(forDouble.widen[Any]) + .orElse(forBigDecimal.widen[Any]) + .construct(node) + case ScalarNode(value, Tag.str) => + Right(value) case MappingNode(mappings, Tag.map) => val decoder = implicitly[YamlDecoder[Map[Any, Any]]] decoder.construct(node) From eb5b7da5b29c3248b853769c8a11f3b4b0ac1363 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:49:01 +0200 Subject: [PATCH 10/11] exhaustive pattern match --- .../org/virtuslab/yaml/YamlDecoder.scala | 74 +++++++++---------- 1 file changed, 36 insertions(+), 38 deletions(-) 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 b36e3408..7a36181e 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -103,49 +103,47 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { } implicit def forAny: YamlDecoder[Any] = new YamlDecoder[Any] { - def construct(node: Node)(implicit settings: LoadSettings = LoadSettings.empty) = { - node match { - case ScalarNode(_, Tag.nullTag) => - Right(None) - case node @ ScalarNode(_, Tag.boolean) => - forBoolean.construct(node) - case node @ ScalarNode(_, Tag.int) => - forByte - .widen[Any] - .orElse(forShort.widen[Any]) - .orElse(forInt.widen[Any]) - .orElse(forLong.widen[Any]) - .orElse(forBigInt.widen[Any]) - .construct(node) - case node @ ScalarNode(_, Tag.float) => - forFloat - .widen[Any] - .orElse(forDouble.widen[Any]) - .orElse(forBigDecimal.widen[Any]) - .construct(node) - case ScalarNode(value, Tag.str) => - Right(value) - case MappingNode(mappings, Tag.map) => - val decoder = implicitly[YamlDecoder[Map[Any, Any]]] - decoder.construct(node) - case SequenceNode(seq, Tag.seq) => - val decoder = implicitly[YamlDecoder[Seq[Any]]] - decoder.construct(node) - case _ => - settings.constructors.get(node.tag) match { - case Some(decoder) => decoder.construct(node) - case None => - Left( - ConstructError( - s"""|Could't construct runtime instance of ${node.tag} + def construct(node: Node)(implicit settings: LoadSettings = LoadSettings.empty) = node match { + case ScalarNode(_, Tag.nullTag) => + Right(None) + case node @ ScalarNode(_, Tag.boolean) => + forBoolean.construct(node) + case node @ ScalarNode(_, Tag.int) => + forByte + .widen[Any] + .orElse(forShort.widen[Any]) + .orElse(forInt.widen[Any]) + .orElse(forLong.widen[Any]) + .orElse(forBigInt.widen[Any]) + .construct(node) + case node @ ScalarNode(_, Tag.float) => + forFloat + .widen[Any] + .orElse(forDouble.widen[Any]) + .orElse(forBigDecimal.widen[Any]) + .construct(node) + case ScalarNode(value, Tag.str) => + Right(value) + case MappingNode(mappings, Tag.map) => + val decoder = implicitly[YamlDecoder[Map[Any, Any]]] + decoder.construct(node) + case SequenceNode(seq, Tag.seq) => + val decoder = implicitly[YamlDecoder[Seq[Any]]] + decoder.construct(node) + case _ => + settings.constructors.get(node.tag) match { + case Some(decoder) => decoder.construct(node) + case None => + Left( + ConstructError( + s"""|Could't construct runtime instance of ${node.tag} |${node.pos.map(_.errorMsg).getOrElse("")} |If you're using custom datatype consider using yaml.as[MyType] instead of Any |Or define LoadSettings where you'll specify how to construct ${node.tag} |""".stripMargin - ) ) - } - } + ) + } } } From 4c1391165d42dbf176aec1f966fb53c1282b5d90 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 29 May 2024 16:49:30 +0200 Subject: [PATCH 11/11] exhaustive pattern match --- .../src/main/scala/org/virtuslab/yaml/YamlDecoder.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 7a36181e..0e02193f 100644 --- a/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala +++ b/core/shared/src/main/scala/org/virtuslab/yaml/YamlDecoder.scala @@ -137,10 +137,10 @@ object YamlDecoder extends YamlDecoderCompanionCrossCompat { Left( ConstructError( s"""|Could't construct runtime instance of ${node.tag} - |${node.pos.map(_.errorMsg).getOrElse("")} - |If you're using custom datatype consider using yaml.as[MyType] instead of Any - |Or define LoadSettings where you'll specify how to construct ${node.tag} - |""".stripMargin + |${node.pos.map(_.errorMsg).getOrElse("")} + |If you're using custom datatype consider using yaml.as[MyType] instead of Any + |Or define LoadSettings where you'll specify how to construct ${node.tag} + |""".stripMargin ) ) }