google_cloud_storage/storage/
transport.rs1use crate::Result;
16use crate::model::{Object, ReadObjectRequest};
17use crate::model_ext::WriteObjectRequest;
18use crate::read_object::ReadObjectResponse;
19use crate::storage::client::StorageInner;
20use crate::storage::perform_upload::PerformUpload;
21use crate::storage::read_object::Reader;
22use crate::storage::request_options::RequestOptions;
23use crate::storage::streaming_source::{Seek, StreamingSource};
24#[cfg(google_cloud_unstable_storage_bidi)]
25use crate::{
26 google::storage::v2::BidiReadObjectSpec, model_ext::OpenObjectRequest,
27 object_descriptor::ObjectDescriptor, storage::bidi::connector::Connector,
28 storage::bidi::transport::ObjectDescriptorTransport,
29};
30use std::sync::Arc;
31
32#[derive(Clone, Debug)]
48pub struct Storage {
49 inner: Arc<StorageInner>,
50}
51
52impl Storage {
53 pub(crate) fn new(inner: Arc<StorageInner>) -> Arc<Self> {
54 Arc::new(Self { inner })
55 }
56}
57
58impl super::stub::Storage for Storage {
59 async fn read_object(
61 &self,
62 req: ReadObjectRequest,
63 options: RequestOptions,
64 ) -> Result<ReadObjectResponse> {
65 let reader = Reader {
66 inner: self.inner.clone(),
67 request: req,
68 options,
69 };
70 reader.response().await
71 }
72
73 async fn write_object_buffered<P>(
75 &self,
76 payload: P,
77 req: WriteObjectRequest,
78 options: RequestOptions,
79 ) -> Result<Object>
80 where
81 P: StreamingSource + Send + Sync + 'static,
82 {
83 PerformUpload::new(payload, self.inner.clone(), req.spec, req.params, options)
84 .send()
85 .await
86 }
87
88 async fn write_object_unbuffered<P>(
90 &self,
91 payload: P,
92 req: WriteObjectRequest,
93 options: RequestOptions,
94 ) -> Result<Object>
95 where
96 P: StreamingSource + Seek + Send + Sync + 'static,
97 {
98 PerformUpload::new(payload, self.inner.clone(), req.spec, req.params, options)
99 .send_unbuffered()
100 .await
101 }
102
103 #[cfg(google_cloud_unstable_storage_bidi)]
104 async fn open_object(
105 &self,
106 request: OpenObjectRequest,
107 options: RequestOptions,
108 ) -> Result<ObjectDescriptor> {
109 let spec = BidiReadObjectSpec::from(request);
110 let connector = Connector::new(spec, options, self.inner.grpc.clone());
111 let transport = ObjectDescriptorTransport::new(connector).await?;
112
113 Ok(ObjectDescriptor::new(transport))
114 }
115}