mochi/context

Types

A function that builds/transforms context from request info Takes the request info and current context, returns modified context or error

pub type ContextBuilder =
  fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
    dict.Dict(String, dynamic.Dynamic),
    String,
  )

Pipeline of context builders that execute in order

pub opaque type ContextPipeline

Information extracted from the incoming HTTP request

pub type RequestInfo {
  RequestInfo(
    headers: dict.Dict(String, String),
    method: String,
    path: String,
  )
}

Constructors

  • RequestInfo(
      headers: dict.Dict(String, String),
      method: String,
      path: String,
    )

    Arguments

    headers

    HTTP headers (lowercase keys)

    method

    HTTP method (GET, POST, etc.)

    path

    Request path

Values

pub fn add_builder(
  pipeline: ContextPipeline,
  builder: fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
    dict.Dict(String, dynamic.Dynamic),
    String,
  ),
) -> ContextPipeline

Add a context builder to the pipeline Builders execute in the order they are added

pub fn add_to_context(
  key: String,
  extractor: fn(RequestInfo) -> Result(dynamic.Dynamic, String),
) -> fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
  dict.Dict(String, dynamic.Dynamic),
  String,
)

Create a builder that adds a value to the context dict

pub fn add_to_context_or(
  key: String,
  extractor: fn(RequestInfo) -> Result(dynamic.Dynamic, String),
  default: dynamic.Dynamic,
) -> fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
  dict.Dict(String, dynamic.Dynamic),
  String,
)

Create a builder that adds a value to context, with a fallback on error

pub fn bearer_token_builder() -> fn(
  RequestInfo,
  dict.Dict(String, dynamic.Dynamic),
) -> Result(dict.Dict(String, dynamic.Dynamic), String)

Builder that extracts the bearer token and adds it to context as “token”

pub fn build_context(
  pipeline: ContextPipeline,
  request: RequestInfo,
  initial: dict.Dict(String, dynamic.Dynamic),
) -> Result(dict.Dict(String, dynamic.Dynamic), String)

Build the execution context by running all builders in sequence Each builder receives the output of the previous builder

pub fn get_authorization(
  info: RequestInfo,
) -> Result(String, Nil)

Get the Authorization header value

pub fn get_bearer_token(info: RequestInfo) -> Result(String, Nil)

Get bearer token from Authorization header

pub fn get_header(
  info: RequestInfo,
  name: String,
) -> Result(String, Nil)

Get a header value from request info (case-insensitive)

pub fn headers_builder() -> fn(
  RequestInfo,
  dict.Dict(String, dynamic.Dynamic),
) -> Result(dict.Dict(String, dynamic.Dynamic), String)

Builder that adds all headers to context under “headers” key

pub fn new_pipeline() -> ContextPipeline

Create a new empty context pipeline

pub fn request_info(
  headers: dict.Dict(String, String),
  method: String,
  path: String,
) -> RequestInfo

Create a new RequestInfo

pub fn request_metadata_builder() -> fn(
  RequestInfo,
  dict.Dict(String, dynamic.Dynamic),
) -> Result(dict.Dict(String, dynamic.Dynamic), String)

Builder that adds request metadata to context

pub fn require(
  validator: fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
    Nil,
    String,
  ),
) -> fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
  dict.Dict(String, dynamic.Dynamic),
  String,
)

Create a builder that validates a condition or fails

pub fn require_bearer_token() -> fn(
  RequestInfo,
  dict.Dict(String, dynamic.Dynamic),
) -> Result(dict.Dict(String, dynamic.Dynamic), String)

Builder that requires a bearer token to be present

pub fn to_dynamic(
  ctx: dict.Dict(String, dynamic.Dynamic),
) -> dynamic.Dynamic

Convert context dict to Dynamic for use with ExecutionContext

pub fn transform(
  transformer: fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
    dict.Dict(String, dynamic.Dynamic),
    String,
  ),
) -> fn(RequestInfo, dict.Dict(String, dynamic.Dynamic)) -> Result(
  dict.Dict(String, dynamic.Dynamic),
  String,
)

Create a builder that transforms the entire context

pub fn try_build_context(
  pipeline: ContextPipeline,
  request: RequestInfo,
  initial: dict.Dict(String, dynamic.Dynamic),
) -> dict.Dict(String, dynamic.Dynamic)

Try to build context, returning initial context on any error

Search Document