use serde::{Deserialize, Serialize}; /*
                                      * Cloud Resource Manager API
                                      *
                                      * Creates, reads, and updates metadata for Google Cloud Platform resource containers.
                                      *
                                      * The version of the OpenAPI document: v3
                                      *
                                      * Generated by: https://openapi-generator.tech
                                      */

use crate::google_rest_apis::cloudresourcemanager_v3::models;

/// TagKey : A TagKey, used to group a set of TagValues.
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct TagKey {
    /// Output only. Creation time.
    #[serde(rename = "createTime", skip_serializing_if = "Option::is_none")]
    pub create_time: Option<String>,
    /// Optional. User-assigned description of the TagKey. Must not exceed 256 characters. Read-write.
    #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    /// Optional. Entity tag which users can pass to prevent race conditions. This field is always set in server responses. See UpdateTagKeyRequest for details.
    #[serde(rename = "etag", skip_serializing_if = "Option::is_none")]
    pub etag: Option<String>,
    /// Immutable. The resource name for a TagKey. Must be in the format `tagKeys/{tag_key_id}`, where `tag_key_id` is the generated numeric id for the TagKey.
    #[serde(rename = "name", skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// Output only. Immutable. Namespaced name of the TagKey.
    #[serde(rename = "namespacedName", skip_serializing_if = "Option::is_none")]
    pub namespaced_name: Option<String>,
    /// Immutable. The resource name of the TagKey's parent. A TagKey can be parented by an Organization or a Project. For a TagKey parented by an Organization, its parent must be in the form `organizations/{org_id}`. For a TagKey parented by a Project, its parent can be in the form `projects/{project_id}` or `projects/{project_number}`.
    #[serde(rename = "parent", skip_serializing_if = "Option::is_none")]
    pub parent: Option<String>,
    /// Optional. A purpose denotes that this Tag is intended for use in policies of a specific policy engine, and will involve that policy engine in management operations involving this Tag. A purpose does not grant a policy engine exclusive rights to the Tag, and it may be referenced by other policy engines. A purpose cannot be changed once set.
    #[serde(rename = "purpose", skip_serializing_if = "Option::is_none")]
    pub purpose: Option<Purpose>,
    /// Optional. Purpose data corresponds to the policy system that the tag is intended for. See documentation for `Purpose` for formatting of this field. Purpose data cannot be changed once set.
    #[serde(rename = "purposeData", skip_serializing_if = "Option::is_none")]
    pub purpose_data: Option<std::collections::HashMap<String, String>>,
    /// Required. Immutable. The user friendly name for a TagKey. The short name should be unique for TagKeys within the same tag namespace. The short name must be 1-63 characters, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between.
    #[serde(rename = "shortName", skip_serializing_if = "Option::is_none")]
    pub short_name: Option<String>,
    /// Output only. Update time.
    #[serde(rename = "updateTime", skip_serializing_if = "Option::is_none")]
    pub update_time: Option<String>,
}

impl TagKey {
    /// A TagKey, used to group a set of TagValues.
    pub fn new() -> TagKey {
        TagKey {
            create_time: None,
            description: None,
            etag: None,
            name: None,
            namespaced_name: None,
            parent: None,
            purpose: None,
            purpose_data: None,
            short_name: None,
            update_time: None,
        }
    }
}
/// Optional. A purpose denotes that this Tag is intended for use in policies of a specific policy engine, and will involve that policy engine in management operations involving this Tag. A purpose does not grant a policy engine exclusive rights to the Tag, and it may be referenced by other policy engines. A purpose cannot be changed once set.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum Purpose {
    #[serde(rename = "PURPOSE_UNSPECIFIED")]
    PurposeUnspecified,
    #[serde(rename = "GCE_FIREWALL")]
    GceFirewall,
    #[serde(rename = "DATA_GOVERNANCE")]
    DataGovernance,
}

impl Default for Purpose {
    fn default() -> Purpose {
        Self::PurposeUnspecified
    }
}
