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

pl.touk.nussknacker.engine.management.sample.service.CustomValidatedService.scala Maven / Gradle / Ivy

package pl.touk.nussknacker.engine.management.sample.service

import cats.data.Validated.Valid
import cats.data.{Validated, ValidatedNel}
import pl.touk.nussknacker.engine.api._
import pl.touk.nussknacker.engine.api.context.ProcessCompilationError.CustomNodeError
import pl.touk.nussknacker.engine.api.context.{ContextTransformation, ProcessCompilationError}
import pl.touk.nussknacker.engine.api.parameter.ParameterName
import pl.touk.nussknacker.engine.api.process.ComponentUseCase
import pl.touk.nussknacker.engine.api.test.InvocationCollectors
import pl.touk.nussknacker.engine.api.typed.typing.{Typed, TypedObjectTypingResult, TypingResult}
import pl.touk.nussknacker.engine.util.service.EnricherContextTransformation

import scala.concurrent.{ExecutionContext, Future}

class CustomValidatedService extends EagerService {

  @MethodToInvoke
  def invoke(
      @ParamName("age") age: Int,
      @ParamName("fields") fields: LazyParameter[java.util.Map[String, String]],
      @OutputVariableName varName: String
  )(implicit nodeId: NodeId): ContextTransformation = {

    def returnType: ValidatedNel[ProcessCompilationError, TypingResult] = {
      if (age < 18) {
        Validated.invalidNel(CustomNodeError("Too young", Some(ParameterName("age"))))
      } else {
        fields.returnType match {
          case TypedObjectTypingResult(fields, _, _) if fields.contains("invalid") =>
            Validated.invalidNel(CustomNodeError("Service is invalid", None))
          case TypedObjectTypingResult(fields, _, _) if fields.values.exists(_ != Typed.typedClass[String]) =>
            Validated.invalidNel(CustomNodeError("All values should be strings", Some(ParameterName("fields"))))
          case _ => Valid(Typed.typedClass[String])
        }
      }
    }

    EnricherContextTransformation(
      varName,
      returnType,
      new ServiceInvoker {
        override def invoke(context: Context)(
            implicit ec: ExecutionContext,
            collector: InvocationCollectors.ServiceInvocationCollector,
            componentUseCase: ComponentUseCase
        ): Future[Any] = {
          Future.successful(
            s"name: ${fields.evaluate(context).get("name")}, age: $age"
          )
        }
      }
    )
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy