PartialServerEndpoint

sttp.tapir.server.PartialServerEndpoint
case class PartialServerEndpoint[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, -R, F[_]](endpoint: Endpoint[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R], securityLogic: MonadError[F] => SECURITY_INPUT => F[Either[ERROR_OUTPUT, PRINCIPAL]]) extends EndpointInputsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R] with EndpointOutputsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R] with EndpointErrorOutputVariantsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R] with EndpointInfoOps[R] with EndpointMetaOps

An endpoint with the security logic provided, and the main logic yet unspecified. See Endpoint.serverSecurityLogic.

The provided security part of the server logic transforms inputs of type SECURITY_INPUT, either to an error of type ERROR_OUTPUT, or value of type PRINCIPAL.

The part of the server logic which is not provided, will have to transform both PRINCIPAL and the rest of the input INPUT either into an error, or a value of type OUTPUT.

Inputs/outputs can be added to partial endpoints as to regular endpoints. The shape of the error outputs can be adjusted in a limited way, by adding new error output variants, similar as if they were defined using Tapir.oneOf; the variants and the existing error outputs should usually have a common supertype (other than Any). Hence, it's possible to create a base, secured input, and then specialise it with inputs, outputs and logic as needed.

Attributes

ERROR_OUTPUT

Error output parameter types.

F

The effect type used in the provided partial server logic.

INPUT

Input parameter types.

OUTPUT

Output parameter types.

PRINCIPAL

The type of the value returned by the security logic.

R

The capabilities that are required by this endpoint's inputs/outputs. Any, if no requirements.

SECURITY_INPUT

Security input parameter types, which the security logic accepts and returns a PRINCIPAL or an error ERROR_OUTPUT.

Graph
Supertypes
trait Serializable
trait Product
trait Equals
trait EndpointErrorOutputVariantsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
trait EndpointOutputsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
trait EndpointOutputsMacros[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
trait EndpointInputsOps[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
trait EndpointInputsMacros[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
class Object
trait Matchable
class Any
Self type
PartialServerEndpoint[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]

Members list

Concise view

Type members

Types

override type EndpointType[_A, _I, _E, _O, -_R] = PartialServerEndpoint[_A, PRINCIPAL, _I, _E, _O, _R, F]
override type ThisType[-_R] = PartialServerEndpoint[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, _R, F]

Value members

Concrete methods

override def errorOutput: EndpointOutput[ERROR_OUTPUT]

Attributes

Definition Classes
override def info: EndpointInfo

Attributes

Definition Classes
override def input: EndpointInput[INPUT]

Attributes

Definition Classes
override def output: EndpointOutput[OUTPUT]

Attributes

Definition Classes
override def securityInput: EndpointInput[SECURITY_INPUT]

Attributes

Definition Classes
def serverLogic(f: PRINCIPAL => INPUT => F[Either[ERROR_OUTPUT, OUTPUT]]): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]
def serverLogicError(f: PRINCIPAL => INPUT => F[ERROR_OUTPUT]): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]
def serverLogicLeftErrorOrSuccess[LE, RE](f: PRINCIPAL => INPUT => F[Either[LE, OUTPUT]])(implicit eIsEither: Either[LE, RE] =:= ERROR_OUTPUT): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]

If the error type is an Either, e.g. when using errorOutEither, this method accepts server logic that returns either success or the Left error type. Use of this method avoids having to wrap the returned error in Left.

If the error type is an Either, e.g. when using errorOutEither, this method accepts server logic that returns either success or the Left error type. Use of this method avoids having to wrap the returned error in Left.

Attributes

def serverLogicOption(f: PRINCIPAL => INPUT => F[Option[OUTPUT]])(implicit eIsUnit: ERROR_OUTPUT =:= Unit): Full[SECURITY_INPUT, PRINCIPAL, INPUT, Unit, OUTPUT, R, F]
def serverLogicPure(f: PRINCIPAL => INPUT => Either[ERROR_OUTPUT, OUTPUT]): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]
def serverLogicRecoverErrors(f: PRINCIPAL => INPUT => F[OUTPUT])(implicit eIsThrowable: ERROR_OUTPUT <:< Throwable, eClassTag: ClassTag[ERROR_OUTPUT]): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]
def serverLogicRightErrorOrSuccess[LE, RE](f: PRINCIPAL => INPUT => F[Either[RE, OUTPUT]])(implicit eIsEither: Either[LE, RE] =:= ERROR_OUTPUT): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]

If the error type is an Either, e.g. when using errorOutEither, this method accepts server logic that returns either success or the Right error type. Use of this method avoids having to wrap the returned error in Right.

If the error type is an Either, e.g. when using errorOutEither, this method accepts server logic that returns either success or the Right error type. Use of this method avoids having to wrap the returned error in Right.

Attributes

def serverLogicSuccess(f: PRINCIPAL => INPUT => F[OUTPUT]): Full[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]

Inherited methods

def attribute[T](k: AttributeKey[T], v: T): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def attribute[T](k: AttributeKey[T]): Option[T]

Attributes

Inherited from:
EndpointInfoOps
def connect: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def delete: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps

Attributes

Inherited from:
EndpointInfoOps
def description(d: String): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def errorOutEither[E2](o: EndpointOutput[E2]): EndpointType[A, I, Either[E, E2], O, R]

Adds a new error variant, where the current error output is represented as a Left, and the given one as a Right.

Adds a new error variant, where the current error output is represented as a Left, and the given one as a Right.

Attributes

Inherited from:
EndpointErrorOutputVariantsOps
def errorOutVariant[E2 >: ERROR_OUTPUT](o: OneOfVariant[_ <: E2])(implicit ct: ClassTag[ERROR_OUTPUT], eEqualToErasure: ErasureSameAsType[ERROR_OUTPUT]): EndpointType[A, I, E2, O, R]

Replaces the current error output with a Tapir.oneOf output, where:

Replaces the current error output with a Tapir.oneOf output, where:

  • the first output variant is the current output: oneOfVariant(errorOutput)
  • the second output variant is the given o

The variant for the current endpoint output will be created using Tapir.oneOfVariant. Hence, the current output will be used if the run-time class of the output matches E. If the erasure of the E type is different from E, there will be a compile-time failure, as no such run-time check is possible. In this case, use errorOutVariantsFromCurrent and create a variant using one of the other variant factory methods (e.g. Tapir.oneOfVariantValueMatcher).

During encoding/decoding, the new o variant will be considered after the current variant.

Usage example:

 sealed trait Parent
 case class Child1(v: String) extends Parent
 case class Child2(v: String) extends Parent

 val e: PublicEndpoint[Unit, Parent, Unit, Any] = endpoint
   .errorOut(stringBody.mapTo[Child1])
   .errorOutVariant[Parent](oneOfVariant(stringBody.mapTo[Child2]))

Adding error output variants is useful when extending the error outputs in a PartialServerEndpoint, created using EndpointServerLogicOps.serverSecurityLogic.

Attributes

E2

A common supertype of the new variant and the current output E.

o

The variant to add. Can be created given an output with one of the Tapir.oneOfVariant methods.

Inherited from:
EndpointErrorOutputVariantsOps
def errorOutVariantPrepend[E2 >: ERROR_OUTPUT](o: OneOfVariant[_ <: E2]): EndpointType[A, I, E2, O, R]

Replaces the current error output with a Tapir.oneOf output, where:

Replaces the current error output with a Tapir.oneOf output, where:

  • the first output variant is the given o
  • the second, default output variant is the current output: oneOfDefaultVariant(errorOutput)

Useful for adding specific error variants, while the more general ones are already covered by the existing error output.

During encoding/decoding, the new o variant will be considered before the current variant.

Adding error output variants is useful when extending the error outputs in a PartialServerEndpoint, created using EndpointServerLogicOps.serverSecurityLogic.

Attributes

E2

A common supertype of the new variant and the current output E.

o

The variant to add. Can be created given an output with one of the Tapir.oneOfVariant methods.

Inherited from:
EndpointErrorOutputVariantsOps
def errorOutVariants[E2 >: ERROR_OUTPUT](first: OneOfVariant[_ <: E2], other: OneOfVariant[_ <: E2]*)(implicit ct: ClassTag[ERROR_OUTPUT], eEqualToErasure: ErasureSameAsType[ERROR_OUTPUT]): EndpointType[A, I, E2, O, R]

Same as errorOutVariant, but allows appending multiple variants in one go.

Same as errorOutVariant, but allows appending multiple variants in one go.

Attributes

Inherited from:
EndpointErrorOutputVariantsOps
def errorOutVariantsFromCurrent[E2 >: ERROR_OUTPUT](variants: EndpointOutput[ERROR_OUTPUT] => List[OneOfVariant[_ <: E2]]): EndpointType[A, I, E2, O, R]

Replace the error output with a Tapir.oneOf output, using the variants returned by variants. The current output should be included in one of the returned variants.

Replace the error output with a Tapir.oneOf output, using the variants returned by variants. The current output should be included in one of the returned variants.

Allows creating the variant list in a custom order, placing the current variant in an arbitrary position, and using default variants if necessary.

Adding error output variants is useful when extending the error outputs in a PartialServerEndpoint, created using EndpointServerLogicOps.serverSecurityLogic.

Attributes

E2

A common supertype of the new variant and the current output E.

Inherited from:
EndpointErrorOutputVariantsOps
def get: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def head: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def in[BS, J, IJ, R2](i: StreamBodyIO[BS, J, R2])(implicit concat: Aux[INPUT, J, IJ]): EndpointType[A, IJ, E, O, R & R2]

Attributes

Inherited from:
EndpointInputsOps
def in[J, IJ](i: EndpointInput[J])(implicit concat: Aux[INPUT, J, IJ]): EndpointType[A, IJ, E, O, R]

Attributes

Inherited from:
EndpointInputsOps

Attributes

Inherited from:
EndpointInfoOps
def mapErrorOut[EE](f: ERROR_OUTPUT => EE)(g: EE => ERROR_OUTPUT): EndpointType[A, I, EE, O, R]

Attributes

Inherited from:
EndpointErrorOutputVariantsOps
def mapIn[II](f: INPUT => II)(g: II => INPUT): EndpointType[A, II, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def mapIn[II](m: Mapping[INPUT, II]): EndpointType[A, II, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def mapInDecode[II](f: INPUT => DecodeResult[II])(g: II => INPUT): EndpointType[A, II, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
inline def mapInTo[CASE_CLASS <: Product](using mc: ProductOf[CASE_CLASS]): EndpointType[A, CASE_CLASS, E, O, R]

Attributes

Inherited from:
EndpointInputsMacros
def mapOut[OO](f: OUTPUT => OO)(g: OO => OUTPUT): EndpointType[A, I, E, OO, R]

Attributes

Inherited from:
EndpointOutputsOps
def mapOut[OO](m: Mapping[OUTPUT, OO]): EndpointType[A, I, E, OO, R]

Attributes

Inherited from:
EndpointOutputsOps
def mapOutDecode[OO](f: OUTPUT => DecodeResult[OO])(g: OO => OUTPUT): EndpointType[A, I, E, OO, R]

Attributes

Inherited from:
EndpointOutputsOps
inline def mapOutTo[CASE_CLASS <: Product](using mc: ProductOf[CASE_CLASS]): EndpointType[A, I, E, CASE_CLASS, R]

Attributes

Inherited from:
EndpointOutputsMacros
def method: Option[Method]

The method defined in a fixed method input in this endpoint, if any (using e.g. EndpointInputsOps.get or EndpointInputsOps.post).

The method defined in a fixed method input in this endpoint, if any (using e.g. EndpointInputsOps.get or EndpointInputsOps.post).

Attributes

Inherited from:
EndpointMetaOps
def method(m: Method): EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def name(n: String): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def options: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def out[PIPE_REQ_RESP, P, OP, R2](i: WebSocketBodyOutput[PIPE_REQ_RESP, _, _, P, R2])(implicit ts: Aux[OUTPUT, P, OP]): EndpointType[A, I, E, OP, R & R2 & WebSockets]

Attributes

Inherited from:
EndpointOutputsOps
def out[BS, P, OP, R2](i: StreamBodyIO[BS, P, R2])(implicit ts: Aux[OUTPUT, P, OP]): EndpointType[A, I, E, OP, R & R2]

Attributes

Inherited from:
EndpointOutputsOps
def out[P, OP](i: EndpointOutput[P])(implicit ts: Aux[OUTPUT, P, OP]): EndpointType[A, I, E, OP, R]

Attributes

Inherited from:
EndpointOutputsOps
def patch: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def post: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def prependIn[BS, J, JI, R2](i: StreamBodyIO[BS, J, R2])(implicit concat: Aux[J, INPUT, JI]): EndpointType[A, JI, E, O, R & R2]

Attributes

Inherited from:
EndpointInputsOps
def prependIn[J, JI](i: EndpointInput[J])(implicit concat: Aux[J, INPUT, JI]): EndpointType[A, JI, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def prependOut[PIPE_REQ_RESP, P, PO, R2](i: WebSocketBodyOutput[PIPE_REQ_RESP, _, _, P, R2])(implicit ts: Aux[P, OUTPUT, PO]): EndpointType[A, I, E, PO, R & R2 & WebSockets]

Attributes

Inherited from:
EndpointOutputsOps
def prependOut[BS, P, PO, R2](i: StreamBodyIO[BS, P, R2])(implicit ts: Aux[P, OUTPUT, PO]): EndpointType[A, I, E, PO, R & R2]

Attributes

Inherited from:
EndpointOutputsOps
def prependOut[P, PO](i: EndpointOutput[P])(implicit ts: Aux[P, OUTPUT, PO]): EndpointType[A, I, E, PO, R]

Attributes

Inherited from:
EndpointOutputsOps
def productElementNames: Iterator[String]

Attributes

Inherited from:
Product
def productIterator: Iterator[Any]

Attributes

Inherited from:
Product
def put: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps
def show: String

Basic information about the endpoint, excluding mapping information, with inputs sorted (first the method, then path, etc.). E.g.: POST /books /add {header Authorization} {body as application/json (UTF-8)} -> {body as text/plain (UTF-8)}/-

Basic information about the endpoint, excluding mapping information, with inputs sorted (first the method, then path, etc.). E.g.: POST /books /add {header Authorization} {body as application/json (UTF-8)} -> {body as text/plain (UTF-8)}/-

Attributes

Inherited from:
EndpointMetaOps
def showDetail: String

Detailed description of the endpoint, with inputs/outputs represented in the same order as originally defined, including mapping information. E.g.:

Detailed description of the endpoint, with inputs/outputs represented in the same order as originally defined, including mapping information. E.g.:

Endpoint(securityin: -, in: /books POST /add {body as application/json (UTF-8)} {header Authorization}, errout: {body as text/plain (UTF-8)}, out: -)

Attributes

Inherited from:
EndpointMetaOps
def showPathTemplate(showPathParam: (Int, PathCapture[_]) => String, showQueryParam: Option[(Int, Query[_]) => String], includeAuth: Boolean, showNoPathAs: String, showPathsAs: Option[String], showQueryParamsAs: Option[String]): String

Shows endpoint path, by default all parametrised path and query components are replaced by {param_name} or {paramN}, e.g. for

Shows endpoint path, by default all parametrised path and query components are replaced by {param_name} or {paramN}, e.g. for

endpoint.in("p1" / path[String] / query[String]("par2"))

returns /p1/{param1}?par2={par2}

Attributes

includeAuth

Should authentication inputs be included in the result.

showNoPathAs

How to show the path if the endpoint does not define any path inputs.

showPathsAs

How to show Tapir.paths inputs (if at all), which capture multiple paths segments

showQueryParamsAs

How to show Tapir.queryParams inputs (if at all), which capture multiple query parameters

Inherited from:
EndpointMetaOps
def showRaw: String

Equivalent to .toString, shows the whole case class structure.

Equivalent to .toString, shows the whole case class structure.

Attributes

Inherited from:
EndpointMetaOps
def showShort: String

Shortened information about the endpoint. If the endpoint is named, returns the name, e.g. [my endpoint]. Otherwise, returns the string representation of the method (if any) and path, e.g. POST /books/add

Shortened information about the endpoint. If the endpoint is named, returns the name, e.g. [my endpoint]. Otherwise, returns the string representation of the method (if any) and path, e.g. POST /books/add

Attributes

Inherited from:
EndpointMetaOps
def summary(s: String): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def tag(t: String): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def tags(ts: List[String]): ThisType[R]

Attributes

Inherited from:
EndpointInfoOps
def trace: EndpointType[A, I, E, O, R]

Attributes

Inherited from:
EndpointInputsOps