use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RecommendationPriority {
PriorityUnspecified,
P4,
P3,
P2,
P1,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RecommendationState {
StateUnspecified,
Active,
Claimed,
Succeeded,
Failed,
Dismissed,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ImpactCategory {
CategoryUnspecified,
Cost,
Security,
Performance,
Manageability,
Sustainability,
Reliability,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Recommendation {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_info: Option<RecommendationStateInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recommender_subtype: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub target_resources: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<RecommendationContent>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub associated_insights: Vec<RecommendationInsightReference>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary_impact: Option<Impact>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub additional_impact: Vec<Impact>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_refresh_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<RecommendationPriority>,
#[serde(skip_serializing_if = "Option::is_none")]
pub etag: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub xor_group_id: Option<String>,
}
impl Recommendation {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
name: "test-google_cloud_recommender_v1_recommendation".into(),
description: Some("test-description".into()),
state_info: Some(RecommendationStateInfo::fixture()),
recommender_subtype: Some("test-recommender_subtype".into()),
target_resources: vec![],
content: Some(RecommendationContent::fixture()),
associated_insights: vec![],
primary_impact: Some(Impact::fixture()),
additional_impact: vec![],
last_refresh_time: Some("test-last_refresh_time".into()),
priority: Some(RecommendationPriority::PriorityUnspecified),
etag: Some("test-etag".into()),
xor_group_id: Some("test-xor_group_id".into()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListRecommendationsResponse {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub recommendations: Vec<Recommendation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_page_token: Option<String>,
}
impl ListRecommendationsResponse {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
recommendations: vec![],
next_page_token: Some("test-next_page_token".into()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationStateInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<RecommendationState>,
#[serde(default)]
#[serde(skip_serializing_if = "HashMap::is_empty")]
pub state_metadata: HashMap<String, String>,
}
impl RecommendationStateInfo {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
state: Some(RecommendationState::StateUnspecified),
state_metadata: Default::default(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationContent {
#[serde(skip_serializing_if = "Option::is_none")]
pub overview: Option<serde_json::Value>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operation_groups: Vec<OperationGroup>,
}
impl RecommendationContent {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
overview: Default::default(),
operation_groups: vec![],
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationInsightReference {
#[serde(skip_serializing_if = "Option::is_none")]
pub insight: Option<String>,
}
impl RecommendationInsightReference {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
insight: Some("test-insight".into()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Impact {
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<ImpactCategory>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_projection: Option<CostProjection>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security_projection: Option<SecurityProjection>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sustainability_projection: Option<SustainabilityProjection>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reliability_projection: Option<ReliabilityProjection>,
}
impl Impact {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
category: Some(ImpactCategory::CategoryUnspecified),
service: Some("test-service".into()),
cost_projection: Some(CostProjection::fixture()),
security_projection: Some(SecurityProjection::fixture()),
sustainability_projection: Some(SustainabilityProjection::fixture()),
reliability_projection: Some(ReliabilityProjection::fixture()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CostProjection {
#[serde(skip_serializing_if = "Option::is_none")]
pub cost: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_in_local_currency: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
}
impl CostProjection {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
cost: Some(Money::fixture()),
cost_in_local_currency: Some(Money::fixture()),
duration: Some("test-duration".into()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SecurityProjection {
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<serde_json::Value>,
}
impl SecurityProjection {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
details: Default::default(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SustainabilityProjection {
#[serde(skip_serializing_if = "Option::is_none")]
pub kg_co2e: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
}
impl SustainabilityProjection {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
duration: Some("test-duration".into()),
..Default::default()
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReliabilityProjection {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub risks: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<serde_json::Value>,
}
impl ReliabilityProjection {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
risks: vec![],
details: Default::default(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OperationGroup {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<RecommendationOperation>,
}
impl OperationGroup {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self { operations: vec![] }
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecommendationOperation {
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_resource: Option<String>,
}
impl RecommendationOperation {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
action: Some("test-action".into()),
resource: Some("test-resource".into()),
resource_type: Some("test-resource_type".into()),
path: Some("test-path".into()),
source_path: Some("test-source_path".into()),
source_resource: Some("test-source_resource".into()),
..Default::default()
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Money {
#[serde(skip_serializing_if = "Option::is_none")]
pub currency_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub units: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nanos: Option<i32>,
}
impl Money {
#[cfg(any(test, feature = "test-support"))]
pub fn fixture() -> Self {
Self {
currency_code: Some("test-currency_code".into()),
units: Some("test-units".into()),
nanos: Some(100),
}
}
}