#![allow(clippy::ref_option, reason = "for the getset crate")]
use crate::places_new::place_photos::PhotoRequest;
#[derive(
//std
Clone,
Debug,
// serde
serde::Serialize,
// getset
getset::Getters,
getset::CopyGetters,
getset::MutGetters,
getset::Setters,
// other
bon::Builder
)]
#[serde(rename_all = "camelCase")]
#[allow(clippy::struct_field_names, reason = "disambiguate photo request information from request")]
pub struct Request<'c> {
#[serde(skip_deserializing, skip_serializing)]
pub(crate) client: &'c crate::Client,
#[getset(get = "pub")]
#[serde(skip_deserializing, skip_serializing)]
pub(crate) photo_request: PhotoRequest,
#[serde(skip_serializing_if = "Option::is_none")]
#[getset(get_copy = "pub")]
pub max_width_px: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[getset(get_copy = "pub")]
pub max_height_px: Option<u32>,
#[builder(default = true)]
#[getset(get_copy = "pub")]
pub skip_http_redirect: bool,
}
#[cfg(feature = "reqwest")]
impl Request<'_> {
pub async fn execute(
self
) -> Result<crate::places_new::place_photos::PhotoImage, crate::Error> {
let bytes = self.client.get_binary_request(&self).await?;
let response = crate::places_new::place_photos::image::Response(bytes);
let photo_image = crate::places_new::place_photos::PhotoImage::from_response(
response,
Some(self.photo_request)
);
Ok(photo_image)
}
}
#[cfg(feature = "reqwest")]
impl<S: request_builder::State> RequestBuilder<'_, S> {
pub async fn execute(self) -> Result<crate::places_new::place_photos::PhotoImage, crate::Error>
where
S: request_builder::IsComplete,
{
let request = self.build();
let bytes = request.client.get_binary_request(&request).await?;
let response = crate::places_new::place_photos::image::Response(bytes);
let photo_image = crate::places_new::place_photos::PhotoImage::from_response(
response,
Some(request.photo_request)
);
Ok(photo_image)
}
}
impl crate::client::Client {
pub fn place_photos_image<P>(
&self,
photo_request: P,
) -> Result<
RequestBuilder<
'_,
crate::places_new::place_photos::image::request::request_builder::SetSkipHttpRedirect<
crate::places_new::place_photos::image::request::request_builder::SetPhotoRequest<
crate::places_new::place_photos::image::request::request_builder::SetClient
>
>
>,
crate::Error,
>
where
P: TryInto<PhotoRequest>,
P::Error: Into<crate::Error>,
{
let photo_request = photo_request
.try_into()
.map_err(Into::into)?;
Ok(Request::builder()
.client(self)
.photo_request(photo_request)
.skip_http_redirect(false))
}
}
#[cfg(feature = "reqwest")]
use crate::request_rate::api::Api;
impl crate::traits::EndPoint for &Request<'_> {
fn service_url() -> &'static str {
""
}
fn output_format() -> std::option::Option<&'static str> {
None
}
#[cfg(feature = "reqwest")]
fn title() -> &'static str {
"Places API (New) Place Photo Image"
}
#[cfg(feature = "reqwest")]
fn apis() -> &'static [Api] {
&[Api::All, Api::PlacesNew, Api::PlacePhoto]
}
}
#[cfg(feature = "reqwest")]
impl crate::traits::RequestBody for &Request<'_> {
fn request_body(&self) -> Result<String, crate::Error> {
Ok(String::new())
}
}
#[cfg(feature = "reqwest")]
impl crate::traits::QueryString for &Request<'_> {
fn query_string(&self) -> String {
let base_url = format!(
"https://places.googleapis.com/v1/{name}/media?key={key}",
name = self.photo_request().name,
key = self.client.key
);
let mut parameters = Vec::with_capacity(3);
if let Some(width) = self.max_width_px {
parameters.push(format!("maxWidthPx={width}"));
}
if let Some(height) = self.max_height_px {
parameters.push(format!("maxHeightPx={height}"));
}
if self.skip_http_redirect {
parameters.push("skipHttpRedirect=true".to_string());
}
if parameters.is_empty() {
base_url
} else {
format!("{base_url}&{query_string}", query_string = parameters.join("&"))
}
}
}
#[cfg(feature = "reqwest")]
impl crate::traits::RequestHeaders for &Request<'_> {
fn request_headers(&self) -> reqwest::header::HeaderMap {
reqwest::header::HeaderMap::new()
}
fn send_x_goog_api_key() -> bool {
false
}
}
#[cfg(feature = "reqwest")]
impl crate::traits::Validatable for &Request<'_> {
fn validate(&self) -> Result<(), crate::Error> {
if self.max_width_px.is_none() && self.max_height_px.is_none() {
let debug = "PhotoRequest { max_width_px: None, max_height_px: None }".to_string();
return Err(crate::places_new::place_photos::Error::MissingPhotoDimensions {
span: (0..debug.len()).into(),
debug,
}.into());
}
if let Some(width) = self.max_width_px {
if !(1..=4800).contains(&width) {
let debug = format!("max_width_px: {width}");
return Err(crate::places_new::place_photos::Error::InvalidPhotoWidth {
width,
span: (0..debug.len()).into(),
debug,
}.into());
}
}
if let Some(height) = self.max_height_px {
if !(1..=4800).contains(&height) {
let debug = format!("max_height_px: {height}");
return Err(crate::places_new::place_photos::Error::InvalidPhotoHeight {
height,
span: (0..debug.len()).into(),
debug,
}.into());
}
}
Ok(())
}
}