def get()

in magenta-lib/src/main/scala/magenta/deployment_type/Param.scala [49:93]


  def get(pkg: DeploymentPackage): Option[T] =
    pkg.pkgSpecificData
      .get(name)
      .flatMap(jsValue => parse(jsValue))

  def parse(jsValue: JsValue): Option[T] = Json.fromJson[T](jsValue).asOpt

  def apply(
      pkg: DeploymentPackage,
      target: DeployTarget,
      reporter: DeployReporter
  ): T = {
    val maybeValue = get(pkg)
    val defaultFromContext = defaultValueFromContext.map(_(pkg, target))

    val maybeDefault =
      defaultValue.orElse(defaultFromContext.flatMap(_.right.toOption))
    (maybeDefault, maybeValue) match {
      // the bucket checks below are to aid migrating to this being a required field as we are simply guessing otherwise
      case (Some(default), Some(value))
          if default == value && !deprecatedDefault =>
        reporter.info(
          s"Parameter $name is unnecessarily explicitly set to the default value of $default"
        )
      case (Some(_), None) if deprecatedDefault =>
        reporter.warning(
          s"Parameter $name must always be explicitly set (the default is deprecated as it is quite magical™)"
        )
      case _ => // otherwise do nothing
    }

    (maybeValue, defaultValue, defaultFromContext) match {
      case (Some(userDefined), _, _)           => userDefined
      case (_, Some(default), _)               => default
      case (_, _, Some(Right(contextDefault))) => contextDefault
      case (_, _, Some(Left(contextError))) =>
        throw new NoSuchElementException(
          s"Error whilst generating default for parameter $name in package ${pkg.name} [${pkg.deploymentType.name}]: $contextError"
        )
      case _ =>
        throw new NoSuchElementException(
          s"Package ${pkg.name} [${pkg.deploymentType.name}] requires parameter $name of type ${manifest.runtimeClass.getSimpleName}"
        )
    }
  }