google_cloud_storage/storage/
transport.rs

1// Copyright 2025 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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/// An implementation of [`stub::Storage`][crate::storage::stub::Storage] that
33/// interacts with the Cloud Storage service.
34///
35/// This is the default implementation of a
36/// [`client::Storage<T>`][crate::storage::client::Storage].
37///
38/// ## Example
39///
40/// ```
41/// # async fn sample() -> anyhow::Result<()> {
42/// use google_cloud_storage::client::Storage;
43/// use google_cloud_storage::stub::DefaultStorage;
44/// let client: Storage<DefaultStorage> = Storage::builder().build().await?;
45/// # Ok(()) }
46/// ```
47#[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    /// Implements [crate::client::Storage::read_object].
60    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    /// Implements [crate::client::Storage::write_object].
74    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    /// Implements [crate::client::Storage::write_object].
89    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}