#[derive(Clone, PartialEq, ::prost::Message)]
pub struct BillingAccount {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(bool, tag = "2")]
pub open: bool,
#[prost(string, tag = "3")]
pub display_name: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub master_billing_account: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProjectBillingInfo {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub project_id: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub billing_account_name: ::prost::alloc::string::String,
#[prost(bool, tag = "4")]
pub billing_enabled: bool,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetBillingAccountRequest {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListBillingAccountsRequest {
#[prost(int32, tag = "1")]
pub page_size: i32,
#[prost(string, tag = "2")]
pub page_token: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub filter: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListBillingAccountsResponse {
#[prost(message, repeated, tag = "1")]
pub billing_accounts: ::prost::alloc::vec::Vec<BillingAccount>,
#[prost(string, tag = "2")]
pub next_page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CreateBillingAccountRequest {
#[prost(message, optional, tag = "1")]
pub billing_account: ::core::option::Option<BillingAccount>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UpdateBillingAccountRequest {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(message, optional, tag = "2")]
pub account: ::core::option::Option<BillingAccount>,
#[prost(message, optional, tag = "3")]
pub update_mask: ::core::option::Option<::prost_types::FieldMask>,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListProjectBillingInfoRequest {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(int32, tag = "2")]
pub page_size: i32,
#[prost(string, tag = "3")]
pub page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListProjectBillingInfoResponse {
#[prost(message, repeated, tag = "1")]
pub project_billing_info: ::prost::alloc::vec::Vec<ProjectBillingInfo>,
#[prost(string, tag = "2")]
pub next_page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetProjectBillingInfoRequest {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UpdateProjectBillingInfoRequest {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(message, optional, tag = "2")]
pub project_billing_info: ::core::option::Option<ProjectBillingInfo>,
}
#[doc = r" Generated client implementations."]
pub mod cloud_billing_client {
#![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
use tonic::codegen::*;
#[doc = " Retrieves GCP Console billing accounts and associates them with projects."]
#[derive(Debug, Clone)]
pub struct CloudBillingClient<T> {
inner: tonic::client::Grpc<T>,
}
impl<T> CloudBillingClient<T>
where
T: tonic::client::GrpcService<tonic::body::BoxBody>,
T::ResponseBody: Body + Send + 'static,
T::Error: Into<StdError>,
<T::ResponseBody as Body>::Error: Into<StdError> + Send,
{
pub fn new(inner: T) -> Self {
let inner = tonic::client::Grpc::new(inner);
Self { inner }
}
pub fn with_interceptor<F>(
inner: T,
interceptor: F,
) -> CloudBillingClient<InterceptedService<T, F>>
where
F: tonic::service::Interceptor,
T: tonic::codegen::Service<
http::Request<tonic::body::BoxBody>,
Response = http::Response<
<T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody,
>,
>,
<T as tonic::codegen::Service<http::Request<tonic::body::BoxBody>>>::Error:
Into<StdError> + Send + Sync,
{
CloudBillingClient::new(InterceptedService::new(inner, interceptor))
}
#[doc = r" Compress requests with `gzip`."]
#[doc = r""]
#[doc = r" This requires the server to support it otherwise it might respond with an"]
#[doc = r" error."]
pub fn send_gzip(mut self) -> Self {
self.inner = self.inner.send_gzip();
self
}
#[doc = r" Enable decompressing responses with `gzip`."]
pub fn accept_gzip(mut self) -> Self {
self.inner = self.inner.accept_gzip();
self
}
#[doc = " Gets information about a billing account. The current authenticated user"]
#[doc = " must be a [viewer of the billing"]
#[doc = " account](https://cloud.google.com/billing/docs/how-to/billing-access)."]
pub async fn get_billing_account(
&mut self,
request: impl tonic::IntoRequest<super::GetBillingAccountRequest>,
) -> Result<tonic::Response<super::BillingAccount>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/GetBillingAccount",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Lists the billing accounts that the current authenticated user has"]
#[doc = " permission to"]
#[doc = " [view](https://cloud.google.com/billing/docs/how-to/billing-access)."]
pub async fn list_billing_accounts(
&mut self,
request: impl tonic::IntoRequest<super::ListBillingAccountsRequest>,
) -> Result<tonic::Response<super::ListBillingAccountsResponse>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/ListBillingAccounts",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Updates a billing account's fields."]
#[doc = " Currently the only field that can be edited is `display_name`."]
#[doc = " The current authenticated user must have the `billing.accounts.update`"]
#[doc = " IAM permission, which is typically given to the"]
#[doc = " [administrator](https://cloud.google.com/billing/docs/how-to/billing-access)"]
#[doc = " of the billing account."]
pub async fn update_billing_account(
&mut self,
request: impl tonic::IntoRequest<super::UpdateBillingAccountRequest>,
) -> Result<tonic::Response<super::BillingAccount>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/UpdateBillingAccount",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Creates a billing account."]
#[doc = " This method can only be used to create"]
#[doc = " [billing subaccounts](https://cloud.google.com/billing/docs/concepts)"]
#[doc = " by GCP resellers."]
#[doc = " When creating a subaccount, the current authenticated user must have the"]
#[doc = " `billing.accounts.update` IAM permission on the master account, which is"]
#[doc = " typically given to billing account"]
#[doc = " [administrators](https://cloud.google.com/billing/docs/how-to/billing-access)."]
#[doc = " This method will return an error if the master account has not been"]
#[doc = " provisioned as a reseller account."]
pub async fn create_billing_account(
&mut self,
request: impl tonic::IntoRequest<super::CreateBillingAccountRequest>,
) -> Result<tonic::Response<super::BillingAccount>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/CreateBillingAccount",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Lists the projects associated with a billing account. The current"]
#[doc = " authenticated user must have the `billing.resourceAssociations.list` IAM"]
#[doc = " permission, which is often given to billing account"]
#[doc = " [viewers](https://cloud.google.com/billing/docs/how-to/billing-access)."]
pub async fn list_project_billing_info(
&mut self,
request: impl tonic::IntoRequest<super::ListProjectBillingInfoRequest>,
) -> Result<tonic::Response<super::ListProjectBillingInfoResponse>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/ListProjectBillingInfo",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Gets the billing information for a project. The current authenticated user"]
#[doc = " must have [permission to view the"]
#[doc = " project](https://cloud.google.com/docs/permissions-overview#h.bgs0oxofvnoo"]
#[doc = " )."]
pub async fn get_project_billing_info(
&mut self,
request: impl tonic::IntoRequest<super::GetProjectBillingInfoRequest>,
) -> Result<tonic::Response<super::ProjectBillingInfo>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/GetProjectBillingInfo",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Sets or updates the billing account associated with a project. You specify"]
#[doc = " the new billing account by setting the `billing_account_name` in the"]
#[doc = " `ProjectBillingInfo` resource to the resource name of a billing account."]
#[doc = " Associating a project with an open billing account enables billing on the"]
#[doc = " project and allows charges for resource usage. If the project already had a"]
#[doc = " billing account, this method changes the billing account used for resource"]
#[doc = " usage charges."]
#[doc = ""]
#[doc = " *Note:* Incurred charges that have not yet been reported in the transaction"]
#[doc = " history of the GCP Console might be billed to the new billing"]
#[doc = " account, even if the charge occurred before the new billing account was"]
#[doc = " assigned to the project."]
#[doc = ""]
#[doc = " The current authenticated user must have ownership privileges for both the"]
#[doc = " [project](https://cloud.google.com/docs/permissions-overview#h.bgs0oxofvnoo"]
#[doc = " ) and the [billing"]
#[doc = " account](https://cloud.google.com/billing/docs/how-to/billing-access)."]
#[doc = ""]
#[doc = " You can disable billing on the project by setting the"]
#[doc = " `billing_account_name` field to empty. This action disassociates the"]
#[doc = " current billing account from the project. Any billable activity of your"]
#[doc = " in-use services will stop, and your application could stop functioning as"]
#[doc = " expected. Any unbilled charges to date will be billed to the previously"]
#[doc = " associated account. The current authenticated user must be either an owner"]
#[doc = " of the project or an owner of the billing account for the project."]
#[doc = ""]
#[doc = " Note that associating a project with a *closed* billing account will have"]
#[doc = " much the same effect as disabling billing on the project: any paid"]
#[doc = " resources used by the project will be shut down. Thus, unless you wish to"]
#[doc = " disable billing, you should always call this method with the name of an"]
#[doc = " *open* billing account."]
pub async fn update_project_billing_info(
&mut self,
request: impl tonic::IntoRequest<super::UpdateProjectBillingInfoRequest>,
) -> Result<tonic::Response<super::ProjectBillingInfo>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/UpdateProjectBillingInfo",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Gets the access control policy for a billing account."]
#[doc = " The caller must have the `billing.accounts.getIamPolicy` permission on the"]
#[doc = " account, which is often given to billing account"]
#[doc = " [viewers](https://cloud.google.com/billing/docs/how-to/billing-access)."]
pub async fn get_iam_policy(
&mut self,
request: impl tonic::IntoRequest<super::super::super::super::iam::v1::GetIamPolicyRequest>,
) -> Result<tonic::Response<super::super::super::super::iam::v1::Policy>, tonic::Status>
{
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/GetIamPolicy",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Sets the access control policy for a billing account. Replaces any existing"]
#[doc = " policy."]
#[doc = " The caller must have the `billing.accounts.setIamPolicy` permission on the"]
#[doc = " account, which is often given to billing account"]
#[doc = " [administrators](https://cloud.google.com/billing/docs/how-to/billing-access)."]
pub async fn set_iam_policy(
&mut self,
request: impl tonic::IntoRequest<super::super::super::super::iam::v1::SetIamPolicyRequest>,
) -> Result<tonic::Response<super::super::super::super::iam::v1::Policy>, tonic::Status>
{
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/SetIamPolicy",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Tests the access control policy for a billing account. This method takes"]
#[doc = " the resource and a set of permissions as input and returns the subset of"]
#[doc = " the input permissions that the caller is allowed for that resource."]
pub async fn test_iam_permissions(
&mut self,
request: impl tonic::IntoRequest<
super::super::super::super::iam::v1::TestIamPermissionsRequest,
>,
) -> Result<
tonic::Response<super::super::super::super::iam::v1::TestIamPermissionsResponse>,
tonic::Status,
> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudBilling/TestIamPermissions",
);
self.inner.unary(request.into_request(), path, codec).await
}
}
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Service {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub service_id: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub display_name: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub business_entity_name: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Sku {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub sku_id: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub description: ::prost::alloc::string::String,
#[prost(message, optional, tag = "4")]
pub category: ::core::option::Option<Category>,
#[prost(string, repeated, tag = "5")]
pub service_regions: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "6")]
pub pricing_info: ::prost::alloc::vec::Vec<PricingInfo>,
#[prost(string, tag = "7")]
pub service_provider_name: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Category {
#[prost(string, tag = "1")]
pub service_display_name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub resource_family: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub resource_group: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub usage_type: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct PricingInfo {
#[prost(message, optional, tag = "1")]
pub effective_time: ::core::option::Option<::prost_types::Timestamp>,
#[prost(string, tag = "2")]
pub summary: ::prost::alloc::string::String,
#[prost(message, optional, tag = "3")]
pub pricing_expression: ::core::option::Option<PricingExpression>,
#[prost(message, optional, tag = "4")]
pub aggregation_info: ::core::option::Option<AggregationInfo>,
#[prost(double, tag = "5")]
pub currency_conversion_rate: f64,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct PricingExpression {
#[prost(string, tag = "1")]
pub usage_unit: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub usage_unit_description: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub base_unit: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub base_unit_description: ::prost::alloc::string::String,
#[prost(double, tag = "7")]
pub base_unit_conversion_factor: f64,
#[prost(double, tag = "2")]
pub display_quantity: f64,
#[prost(message, repeated, tag = "3")]
pub tiered_rates: ::prost::alloc::vec::Vec<pricing_expression::TierRate>,
}
pub mod pricing_expression {
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TierRate {
#[prost(double, tag = "1")]
pub start_usage_amount: f64,
#[prost(message, optional, tag = "2")]
pub unit_price: ::core::option::Option<super::super::super::super::r#type::Money>,
}
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct AggregationInfo {
#[prost(enumeration = "aggregation_info::AggregationLevel", tag = "1")]
pub aggregation_level: i32,
#[prost(enumeration = "aggregation_info::AggregationInterval", tag = "2")]
pub aggregation_interval: i32,
#[prost(int32, tag = "3")]
pub aggregation_count: i32,
}
pub mod aggregation_info {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum AggregationLevel {
Unspecified = 0,
Account = 1,
Project = 2,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum AggregationInterval {
Unspecified = 0,
Daily = 1,
Monthly = 2,
}
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListServicesRequest {
#[prost(int32, tag = "1")]
pub page_size: i32,
#[prost(string, tag = "2")]
pub page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListServicesResponse {
#[prost(message, repeated, tag = "1")]
pub services: ::prost::alloc::vec::Vec<Service>,
#[prost(string, tag = "2")]
pub next_page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListSkusRequest {
#[prost(string, tag = "1")]
pub parent: ::prost::alloc::string::String,
#[prost(message, optional, tag = "2")]
pub start_time: ::core::option::Option<::prost_types::Timestamp>,
#[prost(message, optional, tag = "3")]
pub end_time: ::core::option::Option<::prost_types::Timestamp>,
#[prost(string, tag = "4")]
pub currency_code: ::prost::alloc::string::String,
#[prost(int32, tag = "5")]
pub page_size: i32,
#[prost(string, tag = "6")]
pub page_token: ::prost::alloc::string::String,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListSkusResponse {
#[prost(message, repeated, tag = "1")]
pub skus: ::prost::alloc::vec::Vec<Sku>,
#[prost(string, tag = "2")]
pub next_page_token: ::prost::alloc::string::String,
}
#[doc = r" Generated client implementations."]
pub mod cloud_catalog_client {
#![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
use tonic::codegen::*;
#[doc = " A catalog of Google Cloud Platform services and SKUs."]
#[doc = " Provides pricing information and metadata on Google Cloud Platform services"]
#[doc = " and SKUs."]
#[derive(Debug, Clone)]
pub struct CloudCatalogClient<T> {
inner: tonic::client::Grpc<T>,
}
impl<T> CloudCatalogClient<T>
where
T: tonic::client::GrpcService<tonic::body::BoxBody>,
T::ResponseBody: Body + Send + 'static,
T::Error: Into<StdError>,
<T::ResponseBody as Body>::Error: Into<StdError> + Send,
{
pub fn new(inner: T) -> Self {
let inner = tonic::client::Grpc::new(inner);
Self { inner }
}
pub fn with_interceptor<F>(
inner: T,
interceptor: F,
) -> CloudCatalogClient<InterceptedService<T, F>>
where
F: tonic::service::Interceptor,
T: tonic::codegen::Service<
http::Request<tonic::body::BoxBody>,
Response = http::Response<
<T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody,
>,
>,
<T as tonic::codegen::Service<http::Request<tonic::body::BoxBody>>>::Error:
Into<StdError> + Send + Sync,
{
CloudCatalogClient::new(InterceptedService::new(inner, interceptor))
}
#[doc = r" Compress requests with `gzip`."]
#[doc = r""]
#[doc = r" This requires the server to support it otherwise it might respond with an"]
#[doc = r" error."]
pub fn send_gzip(mut self) -> Self {
self.inner = self.inner.send_gzip();
self
}
#[doc = r" Enable decompressing responses with `gzip`."]
pub fn accept_gzip(mut self) -> Self {
self.inner = self.inner.accept_gzip();
self
}
#[doc = " Lists all public cloud services."]
pub async fn list_services(
&mut self,
request: impl tonic::IntoRequest<super::ListServicesRequest>,
) -> Result<tonic::Response<super::ListServicesResponse>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudCatalog/ListServices",
);
self.inner.unary(request.into_request(), path, codec).await
}
#[doc = " Lists all publicly available SKUs for a given cloud service."]
pub async fn list_skus(
&mut self,
request: impl tonic::IntoRequest<super::ListSkusRequest>,
) -> Result<tonic::Response<super::ListSkusResponse>, tonic::Status> {
self.inner.ready().await.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/google.cloud.billing.v1.CloudCatalog/ListSkus",
);
self.inner.unary(request.into_request(), path, codec).await
}
}
}