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.

Type parameters:
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.

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
PartialServerEndpoint[SECURITY_INPUT, PRINCIPAL, INPUT, ERROR_OUTPUT, OUTPUT, R, F]

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]
override def info: EndpointInfo
Definition Classes
override def input: EndpointInput[INPUT]
Definition Classes
override def output: EndpointOutput[OUTPUT]
Definition Classes
override def securityInput: EndpointInput[SECURITY_INPUT]
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 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 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]
Inherited from:
EndpointInfoOps
def attribute[T](k: AttributeKey[T]): Option[T]
Inherited from:
EndpointInfoOps
def connect: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def delete: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
Inherited from:
EndpointInfoOps
def description(d: String): ThisType[R]
Inherited from:
EndpointInfoOps
def errorOutEither[E2](o: EndpointOutput[E2]): EndpointType[SECURITY_INPUT, INPUT, Either[ERROR_OUTPUT, E2], OUTPUT, 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.

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

Appends a new error output variant.

Appends a new error output variant.

A variant for the current endpoint output will be created using the given Tapir.oneOfVariant. This is needed to capture the logic which allows deciding if a run-time value is applicable to a variant. 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 checked after the current variant.

More specifically, the current error output is replaced with a Tapir.oneOf output, where:

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

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.

Type parameters:
E2

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

Value parameters:
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[SECURITY_INPUT, INPUT, E2, OUTPUT, R]

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

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

Inherited from:
EndpointErrorOutputVariantsOps
def errorOutVariantsFromCurrent[E2 >: ERROR_OUTPUT](variants: EndpointOutput[ERROR_OUTPUT] => List[OneOfVariant[_ <: E2]]): EndpointType[SECURITY_INPUT, INPUT, E2, OUTPUT, 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.

Type parameters:
E2

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

Inherited from:
EndpointErrorOutputVariantsOps
def get: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def head: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def in[BS, J, IJ, R2](i: StreamBodyIO[BS, J, R2])(implicit concat: Aux[INPUT, J, IJ]): EndpointType[SECURITY_INPUT, IJ, ERROR_OUTPUT, OUTPUT, R & R2]
Inherited from:
EndpointInputsOps
def in[J, IJ](i: EndpointInput[J])(implicit concat: Aux[INPUT, J, IJ]): EndpointType[SECURITY_INPUT, IJ, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
Inherited from:
EndpointInfoOps
def mapErrorOut[EE](f: ERROR_OUTPUT => EE)(g: EE => ERROR_OUTPUT): EndpointType[SECURITY_INPUT, INPUT, EE, OUTPUT, R]
def mapIn[II](f: INPUT => II)(g: II => INPUT): EndpointType[SECURITY_INPUT, II, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def mapIn[II](m: Mapping[INPUT, II]): EndpointType[SECURITY_INPUT, II, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def mapInDecode[II](f: INPUT => DecodeResult[II])(g: II => INPUT): EndpointType[SECURITY_INPUT, II, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
inline def mapInTo[CASE_CLASS <: Product](using mc: ProductOf[CASE_CLASS]): EndpointType[SECURITY_INPUT, CASE_CLASS, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsMacros
def mapOut[OO](f: OUTPUT => OO)(g: OO => OUTPUT): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OO, R]
Inherited from:
EndpointOutputsOps
def mapOut[OO](m: Mapping[OUTPUT, OO]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OO, R]
Inherited from:
EndpointOutputsOps
def mapOutDecode[OO](f: OUTPUT => DecodeResult[OO])(g: OO => OUTPUT): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OO, R]
Inherited from:
EndpointOutputsOps
inline def mapOutTo[CASE_CLASS <: Product](using mc: ProductOf[CASE_CLASS]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, CASE_CLASS, R]
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).

Inherited from:
EndpointMetaOps
def method(m: Method): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def name(n: String): ThisType[R]
Inherited from:
EndpointInfoOps
def options: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
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[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OP, R & R2 & WebSockets]
Inherited from:
EndpointOutputsOps
def out[BS, P, OP, R2](i: StreamBodyIO[BS, P, R2])(implicit ts: Aux[OUTPUT, P, OP]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OP, R & R2]
Inherited from:
EndpointOutputsOps
def out[P, OP](i: EndpointOutput[P])(implicit ts: Aux[OUTPUT, P, OP]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OP, R]
Inherited from:
EndpointOutputsOps
def patch: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def post: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps
def prependIn[BS, J, JI, R2](i: StreamBodyIO[BS, J, R2])(implicit concat: Aux[J, INPUT, JI]): EndpointType[SECURITY_INPUT, JI, ERROR_OUTPUT, OUTPUT, R & R2]
Inherited from:
EndpointInputsOps
def prependIn[J, JI](i: EndpointInput[J])(implicit concat: Aux[J, INPUT, JI]): EndpointType[SECURITY_INPUT, JI, ERROR_OUTPUT, OUTPUT, R]
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[SECURITY_INPUT, INPUT, ERROR_OUTPUT, PO, R & R2 & WebSockets]
Inherited from:
EndpointOutputsOps
def prependOut[BS, P, PO, R2](i: StreamBodyIO[BS, P, R2])(implicit ts: Aux[P, OUTPUT, PO]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, PO, R & R2]
Inherited from:
EndpointOutputsOps
def prependOut[P, PO](i: EndpointOutput[P])(implicit ts: Aux[P, OUTPUT, PO]): EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, PO, R]
Inherited from:
EndpointOutputsOps
def productElementNames: Iterator[String]
Inherited from:
Product
def productIterator: Iterator[Any]
Inherited from:
Product
def put: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
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)}/-

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: -)
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}

Value parameters:
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.

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

Inherited from:
EndpointMetaOps
def summary(s: String): ThisType[R]
Inherited from:
EndpointInfoOps
def tag(t: String): ThisType[R]
Inherited from:
EndpointInfoOps
def tags(ts: List[String]): ThisType[R]
Inherited from:
EndpointInfoOps
def trace: EndpointType[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, R]
Inherited from:
EndpointInputsOps