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

org.alephium.api.DecodeFailureHandler.scala Maven / Gradle / Ivy

The newest version!
// Copyright 2018 The Alephium Authors
// This file is part of the alephium project.
//
// The library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the library. If not, see .

package org.alephium.api

import scala.concurrent.Future

import sttp.model.{Header, StatusCode}
import sttp.tapir._
import sttp.tapir.server.interceptor._
import sttp.tapir.server.interceptor.decodefailure.DefaultDecodeFailureHandler
import sttp.tapir.server.interceptor.decodefailure.DefaultDecodeFailureHandler._
import sttp.tapir.server.model.ValuedEndpointOutput

import org.alephium.api.{alphJsonBody, ApiError}

trait DecodeFailureHandler {

  def failureResponse(c: StatusCode, hs: List[Header], m: String): ValuedEndpointOutput[_] = {
    ValuedEndpointOutput(
      statusCode.and(headers).and(alphJsonBody[ApiError.BadRequest]),
      (c, hs, ApiError.BadRequest(m))
    )
  }

  def failureMessage(ctx: DecodeFailureContext): String = {
    val base = FailureMessages.failureSourceMessage(ctx.failingInput)

    val detail = ctx.failure match {
      case DecodeResult.InvalidValue(errors) if errors.nonEmpty =>
        Some(ValidationMessages.validationErrorsMessage(errors))
      case DecodeResult.Error(original, error) => Some(s"${error.getMessage}: $original")
      case _                                   => None
    }

    FailureMessages.combineSourceAndDetail(base, detail)
  }

  val myDecodeFailureHandler =
    DefaultDecodeFailureHandler[Future](respond, failureMessage, failureResponse)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy