All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datamountaineer.streamreactor.connect.schemas.StructHelper.scala Maven / Gradle / Ivy

The newest version!
package com.datamountaineer.streamreactor.connect.schemas

import org.apache.kafka.connect.data.Struct

import scala.collection.JavaConverters._

object StructHelper {

  implicit final class StructExtension(val struct: Struct) extends AnyVal {
    def extractValueFromPath(path: String): Either[FieldValueExtractionError, Option[AnyRef]] = {
      val fields = path.split('.')
      val start: Either[FieldValueExtractionError, State] = Right(State(Some(struct), Vector.empty))

      fields.foldLeft(start) {
        case (l@Left(_), _) => l
        case (s@Right(state), field) =>
          state.value.fold(s.asInstanceOf[Either[FieldValueExtractionError, State]]) {
            case s: Struct =>
              s.fieldValue(field) match {
                case Some(value) =>
                  Right.apply[FieldValueExtractionError, State](state.copy(value = Some(value), path = state.path :+ field))
                case None =>
                  val path = (state.path :+ field).mkString(".")
                  val msg = s"Field [$path] does not exist. Available Fields are [${s.schema().fields().asScala.map(_.name()).mkString(",")}]"
                  Left.apply[FieldValueExtractionError, State](FieldValueExtractionError(path, msg))
              }
            case other =>
              val path = state.path.mkString(".")
              Left.apply[FieldValueExtractionError, State](FieldValueExtractionError(path, s"Expecting a a structure but found [$other]."))
          }
      }
        .map(_.value)
    }

    def fieldValue(field: String): Option[AnyRef] = {
      Option(struct.schema().field(field)).map { _ =>
        struct.get(field)
      }
    }
  }

  private final case class State(value: Option[AnyRef], path: Vector[String])

}

case class FieldValueExtractionError(path: String, msg: String)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy