Skip to content

Commit

Permalink
finos#1296 make parseToDataType to return Option for easier usage w…
Browse files Browse the repository at this point in the history
…ith java
  • Loading branch information
junaidzm13 committed Apr 30, 2024
1 parent 3d6e70a commit 2e773e1
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ private class ColumnValueParser(private val mapper: SchemaMapper) extends Filter
}

private def parseStringToColumnDataType(value: String): Either[ErrorMessage, Any] =
DataType.parseToDataType(value, column.dataType)
DataType.parseToDataType(value, column.dataType) match {
case Some(v) => Right(v)
case None => Left(s"Failed to parse column value '$value' to data type `${column.dataType}`.")
}

private def convertColumnValueToExternalFieldType(columnValue: Any): Either[ErrorMessage, Any] =
mapper.toMappedExternalFieldType(column.name, columnValue)
Expand Down
11 changes: 4 additions & 7 deletions vuu/src/main/scala/org/finos/vuu/core/table/Column.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import org.finos.vuu.api.TableDef
import org.finos.vuu.core.table.column.CalculatedColumnClause
import org.finos.vuu.util.types.{DefaultTypeConverters, TypeConverterContainerBuilder}

import scala.util.{Failure, Success, Try}
import scala.util.Try

object DataType {

// if a new type's added, make sure that both methods `parseToDataType` & `fromString` can support it
final val CharDataType: Class[Char] = classOf[Char]
final val StringDataType: Class[String] = classOf[String]
final val BooleanDataType: Class[Boolean] = classOf[Boolean]
Expand Down Expand Up @@ -37,12 +38,8 @@ object DataType {
}
}

private type ErrorMessage = String
def parseToDataType[T](value: String, t: Class[T]): Either[ErrorMessage, T] = {
Try(typeConverterContainer.convert[String, T](value, classOf[String], t).get) match {
case Success(parsedValue) => Right(parsedValue)
case Failure(ex) => Left(s"Failed to parse String $value to data type $t: ${ex.getMessage}")
}
def parseToDataType[T](value: String, t: Class[T]): Option[T] = {
Try(typeConverterContainer.convert[String, T](value, classOf[String], t).get).toOption
}

private val typeConverterContainer = TypeConverterContainerBuilder()
Expand Down
9 changes: 4 additions & 5 deletions vuu/src/test/scala/org/finos/vuu/core/table/ColumnTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class ColumnTest extends AnyFeatureSpec with Matchers {
Scenario(s"can parse string '$stringInput' to `$dataType` type") {
val parsedValue = DataType.parseToDataType(stringInput, dataType)

parsedValue shouldEqual Right(expectedOutput)
TypeUtils.areTypesEqual(dataType, parsedValue.toOption.get.getClass) shouldBe true
parsedValue shouldEqual Some(expectedOutput)
TypeUtils.areTypesEqual(dataType, parsedValue.get.getClass) shouldBe true
}
})

Expand All @@ -32,11 +32,10 @@ class ColumnTest extends AnyFeatureSpec with Matchers {
(DataType.LongDataType, "33.5"),
(DataType.DoubleDataType, "12x1"),
))((dataType, stringInput) => {
Scenario(s"should return error when string '$stringInput' cannot be parsed to `$dataType` type") {
Scenario(s"should return empty when string '$stringInput' cannot be parsed to `$dataType` type") {
val parsedValue = DataType.parseToDataType(stringInput, dataType)

parsedValue.isLeft shouldBe true
parsedValue.swap.toOption.get should startWith("Failed to parse")
parsedValue shouldBe empty
}
})

Expand Down

0 comments on commit 2e773e1

Please sign in to comment.