{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

-- | You can use the AWS CloudFormation Resource Tags property to apply tags
-- to resources, which can help you identify and categorize those resources.
-- You can tag only resources for which AWS CloudFormation supports tagging.
-- For information about which resources you can tag with AWS CloudFormation,
-- see the individual resources in AWS Resource Types Reference. In addition
-- to any tags you define, AWS CloudFormation automatically creates the
-- following stack-level tags with the prefix aws:: All stack-level tags,
-- including automatically created tags, are propagated to resources that AWS
-- CloudFormation supports. Currently, tags are not propagated to Amazon EBS
-- volumes that are created from block device mappings.

module Stratosphere.ResourceProperties.ResourceTag where

import Control.Lens
import Data.Aeson
import Data.Aeson.Types
import Data.Text
import GHC.Generics

import Stratosphere.Values


-- | Full data type definition for ResourceTag. See 'resourceTag' for a more
-- convenient constructor.
data ResourceTag =
  ResourceTag
  { _resourceTagKey :: Val Text
  , _resourceTagValue :: Val Text
  } deriving (Show, Generic)

instance ToJSON ResourceTag where
  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }

instance FromJSON ResourceTag where
  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }

-- | Constructor for 'ResourceTag' containing required fields as arguments.
resourceTag
  :: Val Text -- ^ 'rtKey'
  -> Val Text -- ^ 'rtValue'
  -> ResourceTag
resourceTag keyarg valuearg =
  ResourceTag
  { _resourceTagKey = keyarg
  , _resourceTagValue = valuearg
  }

-- | The key name of the tag. You can specify a value that is 1 to 128 Unicode
-- characters in length and cannot be prefixed with aws:. You can use any of
-- the following characters: the set of Unicode letters, digits, whitespace,
-- _, ., /, =, +, and -.
rtKey :: Lens' ResourceTag (Val Text)
rtKey = lens _resourceTagKey (\s a -> s { _resourceTagKey = a })

-- | The value for the tag. You can specify a value that is 1 to 128 Unicode
-- characters in length and cannot be prefixed with aws:. You can use any of
-- the following characters: the set of Unicode letters, digits, whitespace,
-- _, ., /, =, +, and -.
rtValue :: Lens' ResourceTag (Val Text)
rtValue = lens _resourceTagValue (\s a -> s { _resourceTagValue = a })