Selecto.Capabilities (Selecto v0.4.6)

Copy Markdown

Shared capability request and decision helpers.

Selecto owns the shape of capability questions and answers, but host applications remain responsible for policy truth. These helpers are small value constructors for adapters, components, write paths, and API layers that need to ask the same kind of question.

Summary

Functions

Resolves one capability request through a host resolver.

Resolves many capability requests.

Builds a hidden deny decision.

Builds a conditional preview-only decision.

Builds a capability request.

Types

capability_id()

@type capability_id() :: atom() | String.t()

context()

@type context() :: map()

operation()

@type operation() :: atom() | String.t()

resolver()

@type resolver() ::
  module()
  | (Selecto.Capabilities.Request.t() -> term())
  | (Selecto.Capabilities.Request.t(), map() -> term())
  | {module(), atom()}

target()

@type target() :: map()

Functions

allow(reason_code \\ :allowed, attrs \\ [])

@spec allow(atom() | String.t(), map() | keyword()) ::
  Selecto.Capabilities.Decision.t()

Builds an allow decision.

decide(resolver, request, opts \\ [])

Resolves one capability request through a host resolver.

Supported resolver shapes are:

  • a one-arity function receiving the request
  • a two-arity function receiving the request and resolver context
  • a module implementing Selecto.Capabilities.Resolver.decide/2
  • {module, function} where the function has arity 2

Resolver return values are normalized to Selecto.Capabilities.Decision.

decide_many(resolver, requests, opts \\ [])

@spec decide_many(
  resolver() | nil,
  [Selecto.Capabilities.Request.t()],
  keyword() | map()
) :: [
  Selecto.Capabilities.Decision.t()
]

Resolves many capability requests.

Module resolvers can implement decide_many/2 for a true batch path. Other resolver shapes fall back to decide/3 for each request while preserving request order.

deny(reason_code \\ :denied, attrs \\ [])

@spec deny(atom() | String.t(), map() | keyword()) ::
  Selecto.Capabilities.Decision.t()

Builds a deny decision.

hidden(reason_code \\ :hidden, attrs \\ [])

@spec hidden(atom() | String.t(), map() | keyword()) ::
  Selecto.Capabilities.Decision.t()

Builds a hidden deny decision.

not_applicable(reason_code \\ :not_applicable, attrs \\ [])

@spec not_applicable(atom() | String.t(), map() | keyword()) ::
  Selecto.Capabilities.Decision.t()

Builds a not-applicable decision.

preview_only(reason_code \\ :preview_only, attrs \\ [])

@spec preview_only(atom() | String.t(), map() | keyword()) ::
  Selecto.Capabilities.Decision.t()

Builds a conditional preview-only decision.

request(attrs)

@spec request(map() | keyword()) :: Selecto.Capabilities.Request.t()

Builds a capability request.