Skip to main content

R2ObjectStore

Struct R2ObjectStore 

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

R2-backed ObjectStore.

Construct with R2ObjectStore::new when keys are already in hand, or R2ObjectStore::from_vault to pull them from the yah keystore (with env-var fallback).

Implementations§

Source§

impl R2ObjectStore

Source

pub fn new( account_id: impl Into<String>, bucket: impl Into<String>, access_key: impl Into<String>, secret_key: impl Into<String>, ) -> Result<Self, Error>

Construct with explicit keys.

account_id is the Cloudflare account id (the subdomain in <account_id>.r2.cloudflarestorage.com).

Source

pub fn with_endpoint(self, endpoint: impl Into<String>) -> Self

Point this store at an S3-compatible endpoint other than R2 — in practice, the pond tier’s local MinIO (http://127.0.0.1:9000).

Everything else about the store is already endpoint-agnostic: the bucket lives in the URL path (path-style addressing, which MinIO also speaks) and SigV4 is signed against whatever host the URL names.

This exists because without it the pond rehearsal could not exercise the read side of a publish at all. publish_to_pond uploads a directory tree and offers no way to read an object back, so the one part of a release that is a read-modify-write — the accumulating index.json that https://yah.dev/releases renders from — was the one part a green local rehearsal proved nothing about (R330-T32). A conditional-write loop that has never run is a conditional-write loop you do not have.

The region stays "auto"; MinIO accepts it.

Source

pub fn from_vault( account_id: impl Into<String>, bucket: impl Into<String>, ) -> Result<Self, Error>

Construct from the yah keystore (vault), falling back to env vars.

Reads cloudflare-r2-access-key-id / cloudflare-r2-secret-key slots (env fallback CF_R2_ACCESS_KEY_ID / CF_R2_SECRET_KEY). Returns Error::Auth if either is missing.

Source§

impl R2ObjectStore

Source

pub fn list_prefix_detailed( &self, prefix: &str, ) -> Result<Vec<ObjectMeta>, Error>

List objects under prefix returning key + size + last-modified.

Same paginated request as ObjectStore::list_prefix but parses the <Size> and <LastModified> siblings of each <Key> element. Used by the data-tab bucket viewer to render a directory-style listing.

Trait Implementations§

Source§

impl Drop for R2ObjectStore

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl ObjectStore for R2ObjectStore

Source§

fn locate(&self, key: &str) -> String

Where key lives, in a form an operator can act on — a URL for a remote backend, an opaque descriptor otherwise (R746-F1). Read more
Source§

fn put(&self, key: &str, data: Vec<u8>) -> Result<(), Error>

Write data at key. Overwrites any existing object unconditionally. Read more
Source§

fn put_cached( &self, key: &str, data: Vec<u8>, cache_control: &str, ) -> Result<(), Error>

Write data at key with an explicit Cache-Control (R703-B8). Read more
Source§

fn get(&self, key: &str) -> Result<Option<Vec<u8>>, Error>

Read bytes at key. Returns None when the key does not exist — NotFound is reserved for ambiguous cases (HEAD-then-GET race etc.).
Source§

fn head(&self, key: &str) -> Result<bool, Error>

Returns true when key exists. Cheaper than get for backends that support HEAD; the default impl falls back to get(...).is_some().
Source§

fn delete(&self, key: &str) -> Result<(), Error>

Remove key. Idempotent — succeeds whether or not the key existed.
Source§

fn list_prefix(&self, prefix: &str) -> Result<Vec<String>, Error>

List all keys with the given prefix (prefix-match, not glob).
Source§

fn put_if( &self, key: &str, data: Vec<u8>, cond: Precondition, ) -> Result<String, Error>

Conditionally write data at key, returning the resulting ETag. Read more
Source§

fn etag(&self, key: &str) -> Result<Option<String>, Error>

Current ETag of key, or None if absent. Read more

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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