pub struct ObjectDescriptor { /* private fields */ }Expand description
An open object ready to read one or more ranges.
§Example
use google_cloud_storage::{client::Storage, model_ext::ReadRange};
let client = Storage::builder().build().await?;
let open: ObjectDescriptor = client
.open_object("projects/_/buckets/my-bucket", "my-object")
.send().await?;
println!("metadata = {:?}", open.object());
// Read 2000 bytes starting at offset 1000.
let mut reader = open.read_range(ReadRange::segment(1000, 2000)).await;
while let Some(data) = reader.next().await.transpose()? {
println!("received {} bytes", data.len());
}This is analogous to a “file descriptor”. It represents an object in Cloud
Storage that has been “opened” and is ready for more read operations. An
object descriptor can have multiple concurrent read operations at a time.
You may call read_range() even if previous reads have not completed.
There are no guarantees about the order of the responses. All the data for
a read_range() may be returned before any data of earlier read_range()
calls, or the data may arrive in any interleaved order. Naturally, the data
for a single ranged read arrives in order.
You should actively read from all concurrent reads: the client library uses
separate buffers for each read_range() call, but once a buffer is full the
library will stop delivering data to all the concurrent reads.
Implementations§
Source§impl ObjectDescriptor
impl ObjectDescriptor
Sourcepub fn object(&self) -> Object
pub fn object(&self) -> Object
Returns the metadata for the open object.
§Example
let descriptor = open();
println!("object generation = {}", descriptor.object().generation);
fn open() -> ObjectDescriptor {
// ... details omitted ...
}Sourcepub async fn read_range(&self, range: ReadRange) -> ReadObjectResponse
pub async fn read_range(&self, range: ReadRange) -> ReadObjectResponse
Start reading a range.
§Example
use google_cloud_storage::{model_ext::ReadRange, read_object::ReadObjectResponse};
const MIB: u64 = 1024 * 1024;
let descriptor = open();
println!("object generation = {}", descriptor.object().generation);
// Read 2 MiB starting at offset 0.
let read1 = descriptor.read_range(ReadRange::segment(0, 2 * MIB)).await;
// Concurrently read 2 MiB starting at offset 4 MiB.
let read2 = descriptor.read_range(ReadRange::segment(4 * MIB, 2 * MIB)).await;
let t1 = tokio::spawn(async move { do_read(read1) });
let t2 = tokio::spawn(async move { do_read(read2) });
async fn do_read(mut reader: ReadObjectResponse) {
// ... details omitted ...
}
fn open() -> ObjectDescriptor {
// ... details omitted ...
}Sourcepub fn headers(&self) -> HeaderMap
pub fn headers(&self) -> HeaderMap
Returns metadata about the original open_object() request.
§Example
let descriptor = open();
// Often useful when troubleshooting problems with Google Support.
let headers = descriptor.headers();
println!("debugging header = {:?}", headers.get("x-guploader-uploadid"));
fn open() -> ObjectDescriptor {
// ... details omitted ...
}Sourcepub fn new<T>(inner: T) -> Selfwhere
T: ObjectDescriptor + 'static,
pub fn new<T>(inner: T) -> Selfwhere
T: ObjectDescriptor + 'static,
Create a new instance.
Application developers should only need to create an ObjectDescriptor
in unit tests.
Trait Implementations§
Source§impl Clone for ObjectDescriptor
impl Clone for ObjectDescriptor
Source§fn clone(&self) -> ObjectDescriptor
fn clone(&self) -> ObjectDescriptor
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for ObjectDescriptor
impl !RefUnwindSafe for ObjectDescriptor
impl Send for ObjectDescriptor
impl Sync for ObjectDescriptor
impl Unpin for ObjectDescriptor
impl !UnwindSafe for ObjectDescriptor
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request