Skip to main content

RequestBuilder

Struct RequestBuilder 

Source
pub struct RequestBuilder<'a> { /* private fields */ }
Expand description

One call, before it is sent.

Implementations§

Source§

impl RequestBuilder<'_>

Source

pub fn query(self, name: &str, value: impl Display) -> Self

A query parameter. Repeating a name sends it twice, which is how the API spells a list.

Source

pub fn maybe_query(self, name: &str, value: Option<impl Display>) -> Self

A query parameter, if there is one to send.

Source

pub fn header(self, name: &str, value: impl Into<String>) -> Self

A header. If-Match on the policy file is what this is for.

Source

pub fn json(self, body: &impl Serialize) -> Self

A JSON body.

Source

pub fn text(self, content_type: &str, body: impl Into<String>) -> Self

A body that is text rather than JSON, under a content type of its own.

The policy file is the reason: it is HuJSON — JSON with comments and trailing commas — and a caller who wrote one wants it sent as written, comments included. Sending it as a JSON string would send the document quoted and escaped, which is a different document.

Source

pub fn budget(self, budget: Duration) -> Self

The whole of this call, retries and backoff included: past it the call ends as a timeout whatever it was doing.

The default is the client’s, which is the tool timeout; a tool that waits on something slower passes its own. One attempt is separately capped at the client’s budget, so raising this raises how long a call may spend across attempts rather than how long one may stall.

Source

pub async fn send(self) -> Result<Value, ApiError>

Send it, and read the answer as JSON.

An empty body — which is what a successful DELETE sends — comes back as Value::Null rather than as a failure to parse nothing.

Source

pub async fn send_as<T: DeserializeOwned>(self) -> Result<T, ApiError>

Send it, and read the answer as a particular shape.

Source

pub async fn send_answer<T: DeserializeOwned>( self, ) -> Result<Answer<T>, ApiError>

Send it, and read the answer both ways at once.

ADR-0003 asks for “the parsed model together with the raw body and the headers that matter”, and this is why: a tool forwards the body it was given, unrenamed and with every field the control plane sent, while the server reads the typed value to decide what to do next. Parsing twice would be two chances to disagree, so the model is deserialised from the Value rather than from the bytes a second time.

An empty body reads as Value::Null, the same as send gives it, and T has to be a type that can read null — Value or () or an Option. A model cannot: every one of them carries a flattened map of unknown fields, which makes it a map to serde, and serde will not read a map from null. That is the right way round, because the endpoints that answer with nothing are the deletions, and a deletion has no model to answer with.

Source

pub async fn send_text(self) -> Result<TextBody, ApiError>

Send it, and read the answer as text.

The policy file is HuJSON — comments and trailing commas — so it is not JSON to parse, and its ETag is what a later write has to quote.

Trait Implementations§

Source§

impl<'a> Debug for RequestBuilder<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for RequestBuilder<'a>

§

impl<'a> !UnwindSafe for RequestBuilder<'a>

§

impl<'a> Freeze for RequestBuilder<'a>

§

impl<'a> Send for RequestBuilder<'a>

§

impl<'a> Sync for RequestBuilder<'a>

§

impl<'a> Unpin for RequestBuilder<'a>

§

impl<'a> UnsafeUnpin for RequestBuilder<'a>

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<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> 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, 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