pub struct Context<'a, 'h, C> { /* private fields */ }Expand description
The handle a function receives for one invocation.
It carries the function’s typed, already-deserialized config,
the caller’s id, and a borrow of the host so you can
query the database. Construct it via the function! macro —
you won’t build one yourself.
Implementations§
Source§impl<'a, 'h, C> Context<'a, 'h, C>
impl<'a, 'h, C> Context<'a, 'h, C>
Sourcepub fn hook(&self) -> Option<&Hook>
pub fn hook(&self) -> Option<&Hook>
The lifecycle-hook context when this call came from a resource hook, or
None when the function was invoked directly over HTTP.
This is where the data around the operation lives: the row that was created, fetched or deleted, the rows a list returned, the request URL, and the caller’s auth status.
match ctx.hook() {
Some(h) if h.is_before() => validate(h.data()),
Some(h) => audit(&h.event, h.row()),
None => {} // plain HTTP call
}Sourcepub fn config(&self) -> &C
pub fn config(&self) -> &C
The function’s resolved, typed configuration (functions/<name>.toml).
Sourcepub fn principal_id(&self) -> &str
pub fn principal_id(&self) -> &str
The authenticated caller’s user id, or "" when the endpoint is public
and the caller is anonymous.
Sourcepub fn query(&self, sql: &str, params: &[Value]) -> Result<Vec<Value>, String>
pub fn query(&self, sql: &str, params: &[Value]) -> Result<Vec<Value>, String>
Run a SELECT (or WITH) and get the rows as JSON objects.
Sourcepub fn query_one(
&self,
sql: &str,
params: &[Value],
) -> Result<Option<Value>, String>
pub fn query_one( &self, sql: &str, params: &[Value], ) -> Result<Option<Value>, String>
Run a query expected to return at most one row.
Sourcepub fn execute(&self, sql: &str, params: &[Value]) -> Result<u64, String>
pub fn execute(&self, sql: &str, params: &[Value]) -> Result<u64, String>
Run an INSERT/UPDATE/DELETE and get the number of affected rows.
Sourcepub fn send_email(&self, email: Email) -> Result<Sent, String>
pub fn send_email(&self, email: Email) -> Result<Sent, String>
Send an email through whichever provider the app configured in
[email], and get the provider’s receipt back.
The function doesn’t know or care which provider that is: the same call
goes out through SES, SendGrid, Brevo, Mailjet or a plain SMTP relay
depending on one line of main.toml.
ctx.send_email(
Email::to("ann@example.com")
.subject("Welcome")
.text("Glad you're here.")
.html("<p>Glad you're here.</p>"),
)?;Errors when no provider is configured, when the message has no recipient, or when the provider refuses it. Whether that should fail the request is the caller’s decision — a failed welcome email usually shouldn’t undo the signup that triggered it.
Sourcepub fn cache_get(&self, key: &str) -> Result<Option<Value>, String>
pub fn cache_get(&self, key: &str) -> Result<Option<Value>, String>
Read a value from the app’s Redis cache. None for a miss.
if let Some(hit) = ctx.cache_get("rates:eur")? {
return Ok(hit);
}
let rates = fetch();
ctx.cache_set("rates:eur", &rates, Some(900))?;Errors when the app configured no cache, or when Redis is unreachable.
Since a cache holds only what can be recomputed, treating an error like
a miss (ctx.cache_get(k).ok().flatten()) is a reasonable choice — and
the one that keeps the endpoint working while Redis restarts.
Sourcepub fn cache_get_as<T: DeserializeOwned>(
&self,
key: &str,
) -> Result<Option<T>, String>
pub fn cache_get_as<T: DeserializeOwned>( &self, key: &str, ) -> Result<Option<T>, String>
Read a value and deserialize it. A miss and a value of the wrong shape
both come back as None, because a cache entry written by an older
version of the function is a miss in every way that matters.
Sourcepub fn cache_set<T: Serialize>(
&self,
key: &str,
value: &T,
ttl_secs: Option<u64>,
) -> Result<(), String>
pub fn cache_set<T: Serialize>( &self, key: &str, value: &T, ttl_secs: Option<u64>, ) -> Result<(), String>
Write a value, expiring after ttl_secs. None uses the app’s
[cache] default_ttl_secs; Some(0) means “keep it until deleted”.
Sourcepub fn cache_delete(&self, key: &str) -> Result<bool, String>
pub fn cache_delete(&self, key: &str) -> Result<bool, String>
Drop a key. true when it was there.
Sourcepub fn cache_incr(
&self,
key: &str,
by: i64,
ttl_secs: Option<u64>,
) -> Result<i64, String>
pub fn cache_incr( &self, key: &str, by: i64, ttl_secs: Option<u64>, ) -> Result<i64, String>
Add by to a counter and return its new value, starting from zero.
The increment happens on the server, so this counts correctly across
every worker and every host — which is what makes it usable for rate
limiting, and what a get + set pair could not do. ttl_secs is
applied only when the counter is created, so a window doesn’t extend
itself on every hit.
Auto Trait Implementations§
impl<'a, 'h, C> Freeze for Context<'a, 'h, C>where
C: Freeze,
impl<'a, 'h, C> RefUnwindSafe for Context<'a, 'h, C>where
C: RefUnwindSafe,
impl<'a, 'h, C> Send for Context<'a, 'h, C>where
C: Send,
impl<'a, 'h, C> Sync for Context<'a, 'h, C>where
C: Sync,
impl<'a, 'h, C> Unpin for Context<'a, 'h, C>where
C: Unpin,
impl<'a, 'h, C> UnsafeUnpin for Context<'a, 'h, C>where
C: UnsafeUnpin,
impl<'a, 'h, C> UnwindSafe for Context<'a, 'h, C>where
C: UnwindSafe,
Blanket Implementations§
Source§impl<T> AlignerFor<1> for T
impl<T> AlignerFor<1> for T
Source§impl<T> AlignerFor<2> for T
impl<T> AlignerFor<2> for T
Source§impl<T> AlignerFor<4> for T
impl<T> AlignerFor<4> for T
Source§impl<T> AlignerFor<8> for T
impl<T> AlignerFor<8> for T
Source§impl<T> AlignerFor<16> for T
impl<T> AlignerFor<16> for T
Source§impl<T> AlignerFor<32> for T
impl<T> AlignerFor<32> for T
Source§impl<T> AlignerFor<64> for T
impl<T> AlignerFor<64> for T
Source§impl<T> AlignerFor<128> for T
impl<T> AlignerFor<128> for T
Source§type Aligner = AlignTo128<T>
type Aligner = AlignTo128<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<256> for T
impl<T> AlignerFor<256> for T
Source§type Aligner = AlignTo256<T>
type Aligner = AlignTo256<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<512> for T
impl<T> AlignerFor<512> for T
Source§type Aligner = AlignTo512<T>
type Aligner = AlignTo512<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<1024> for T
impl<T> AlignerFor<1024> for T
Source§type Aligner = AlignTo1024<T>
type Aligner = AlignTo1024<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<2048> for T
impl<T> AlignerFor<2048> for T
Source§type Aligner = AlignTo2048<T>
type Aligner = AlignTo2048<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<4096> for T
impl<T> AlignerFor<4096> for T
Source§type Aligner = AlignTo4096<T>
type Aligner = AlignTo4096<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<8192> for T
impl<T> AlignerFor<8192> for T
Source§type Aligner = AlignTo8192<T>
type Aligner = AlignTo8192<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<16384> for T
impl<T> AlignerFor<16384> for T
Source§type Aligner = AlignTo16384<T>
type Aligner = AlignTo16384<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> AlignerFor<32768> for T
impl<T> AlignerFor<32768> for T
Source§type Aligner = AlignTo32768<T>
type Aligner = AlignTo32768<T>
AlignTo* type which aligns Self to ALIGNMENT.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
Source§fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
offset. Read moreSource§fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
offset. Read moreSource§fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
offset. Read moreSource§fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
offset. Read moreSource§impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
Source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
offset) with value,
returning the previous value of the field. Read moreSource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
Source§impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
Source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
offset) with value,
returning the previous value of the field. Read moreSource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
Source§impl<T> SelfOps for Twhere
T: ?Sized,
impl<T> SelfOps for Twhere
T: ?Sized,
Source§fn piped<F, U>(self, f: F) -> U
fn piped<F, U>(self, f: F) -> U
Source§fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
piped except that the function takes &Self
Useful for functions that take &Self instead of Self. Read moreSource§fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
piped, except that the function takes &mut Self.
Useful for functions that take &mut Self instead of Self.Source§fn mutated<F>(self, f: F) -> Self
fn mutated<F>(self, f: F) -> Self
Source§fn observe<F>(self, f: F) -> Self
fn observe<F>(self, f: F) -> Self
Source§fn as_ref_<T>(&self) -> &T
fn as_ref_<T>(&self) -> &T
AsRef,
using the turbofish .as_ref_::<_>() syntax. Read more