Skip to main content

Builder

Struct Builder 

Source
pub struct Builder { /* private fields */ }
Expand description

Builds the application with routes of the caller’s own beside the API.

For a binary of your own that depends on this crate rather than a fork of it: webhooks, an endpoint that does several things in one transaction, anything that is not a table or a function.

use axum::{routing::post, Router};
use postrust_server::{AppState, Builder, Host};
use std::sync::Arc;

let hooks: Router<Arc<AppState>> = Router::new().route("/stripe", post(|| async { "ok" }));
let config = postrust_core::AppConfig::try_from_env()?;
let app = Builder::new(config, Host::SERVER)
    .nest("/hooks", hooks)
    .build()
    .await?;

A nested router is served with everything the API is served with: the CORS policy, the body limit, the OPTIONS handling and the shared AppState. Its routes are explicit routes, so in compatibility mode they are matched before the REST surface served at the root – a table that shares a prefix’s name is shadowed there, and stays reachable under /api.

Builder::layer is for what has to see every request rather than only the caller’s own: an authentication gate, a rate limit, a header every response carries.

Implementations§

Source§

impl Builder

Source

pub fn new(config: AppConfig, host: Host) -> Self

The application config asks for, on host, with nothing added yet.

Source

pub fn nest( self, prefix: impl Into<String>, router: Router<Arc<AppState>>, ) -> Self

Serve router under prefix. May be called more than once.

The prefix is taken as a path: the leading slash is added if missing and a trailing one dropped, so "hooks", "/hooks" and "/hooks/" are one prefix. Nothing is checked until Builder::build, which refuses a prefix that is the root, that overlaps a path the server serves itself (RESERVED_PREFIXES, and /_ itself), or that overlaps another prefix given here. In compatibility mode, where REST is served at / as well, a prefix whose first segment is rpc or the name of a table or view in an exposed schema takes those paths from REST, and a warning says so at start-up. A prefix beneath /_, such as /_/hooks, is served beside the built-in /_/health and /_/ready.

Source

pub fn layer<L>(self, layer: L) -> Self
where L: Layer<Route> + Clone + Send + Sync + 'static, L::Service: Service<Request> + Clone + Send + Sync + 'static, <L::Service as Service<Request>>::Response: IntoResponse + 'static, <L::Service as Service<Request>>::Error: Into<Infallible> + 'static, <L::Service as Service<Request>>::Future: Send + 'static,

Wrap the whole application in layer. May be called more than once.

Outermost, around every route the server serves and around its own layers too, so it sees each request first and each response last – including a preflight the CORS policy answers itself, and a refusal that never reaches a handler. Of several, the one given last is the outermost, as with Router::layer.

For something only the caller’s own routes need, put the layer on the router given to Builder::nest instead.

Source

pub async fn build(self) -> Result<App>

Connect, load the schema cache and build the router.

The prefixes given to Builder::nest are checked first, before anything is connected to, so a clash is reported as an error rather than as a panic from the router – and without a database to find it. Otherwise as build.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> MaybeSend for T
where T: Send + ?Sized,

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more