use rsb_derive::Builder;
use rvstruct::ValueStruct;
#[derive(Debug, Clone, Eq, PartialEq, Hash, ValueStruct)]
pub struct FirestoreRequestTag(String);
#[derive(Debug, Clone, Eq, PartialEq, Builder)]
pub struct FirestoreRequestOptions {
#[default = "Vec::new()"]
pub request_tags: Vec<FirestoreRequestTag>,
}
impl FirestoreRequestOptions {
#[inline]
pub fn from_tags<I>(tags: I) -> Self
where
I: IntoIterator,
I::Item: Into<FirestoreRequestTag>,
{
Self {
request_tags: tags.into_iter().map(Into::into).collect(),
}
}
#[inline]
pub(crate) fn resolve(
operation_options: Option<&FirestoreRequestOptions>,
session_options: Option<&FirestoreRequestOptions>,
) -> Option<gcloud_sdk::google::firestore::v1::RequestOptions> {
operation_options
.or(session_options)
.filter(|options| !options.request_tags.is_empty())
.map(|options| options.into())
}
}
impl From<&FirestoreRequestOptions> for gcloud_sdk::google::firestore::v1::RequestOptions {
fn from(options: &FirestoreRequestOptions) -> Self {
gcloud_sdk::google::firestore::v1::RequestOptions {
request_tags: options
.request_tags
.iter()
.map(|tag| tag.value().clone())
.collect(),
}
}
}
impl From<FirestoreRequestOptions> for gcloud_sdk::google::firestore::v1::RequestOptions {
fn from(options: FirestoreRequestOptions) -> Self {
gcloud_sdk::google::firestore::v1::RequestOptions {
request_tags: options
.request_tags
.into_iter()
.map(|tag| tag.into_value())
.collect(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_request_tag_from_str() {
let tag: FirestoreRequestTag = "checkout".into();
assert_eq!(tag.value(), "checkout");
}
#[test]
fn test_request_options_from_tags() {
let options = FirestoreRequestOptions::from_tags(["tag-1", "tag-2"]);
assert_eq!(
options.request_tags,
vec![
FirestoreRequestTag::from("tag-1"),
FirestoreRequestTag::from("tag-2"),
]
);
}
#[test]
fn test_request_options_new_is_empty() {
assert!(FirestoreRequestOptions::new().request_tags.is_empty());
}
#[test]
fn test_request_options_conversion() {
let options = FirestoreRequestOptions::from_tags(["a", "b"]);
let proto: gcloud_sdk::google::firestore::v1::RequestOptions = (&options).into();
assert_eq!(proto.request_tags, vec!["a".to_string(), "b".to_string()]);
let owned_proto: gcloud_sdk::google::firestore::v1::RequestOptions = options.into();
assert_eq!(
owned_proto.request_tags,
vec!["a".to_string(), "b".to_string()]
);
}
#[test]
fn test_resolve_prefers_operation_options() {
let operation_options = FirestoreRequestOptions::from_tags(["operation"]);
let session_options = FirestoreRequestOptions::from_tags(["session"]);
assert_eq!(
FirestoreRequestOptions::resolve(Some(&operation_options), Some(&session_options))
.map(|options| options.request_tags),
Some(vec!["operation".to_string()])
);
assert_eq!(
FirestoreRequestOptions::resolve(None, Some(&session_options))
.map(|options| options.request_tags),
Some(vec!["session".to_string()])
);
assert_eq!(
FirestoreRequestOptions::resolve(Some(&operation_options), None)
.map(|options| options.request_tags),
Some(vec!["operation".to_string()])
);
assert_eq!(FirestoreRequestOptions::resolve(None, None), None);
}
#[test]
fn test_resolve_skips_empty_tags() {
let empty_options = FirestoreRequestOptions::new();
let session_options = FirestoreRequestOptions::from_tags(["session"]);
assert_eq!(FirestoreRequestOptions::resolve(None, None), None);
assert_eq!(
FirestoreRequestOptions::resolve(Some(&empty_options), Some(&session_options)),
None
);
assert_eq!(
FirestoreRequestOptions::resolve(None, Some(&empty_options)),
None
);
}
}