module Stackctl.TagOption
  ( tagOption
  ) where

import Stackctl.Prelude

import qualified Data.Text as T
import Options.Applicative
import Stackctl.AWS.CloudFormation (Tag, newTag)

tagOption :: Parser Tag
tagOption :: Parser Tag
tagOption =
  forall a. ReadM a -> Mod OptionFields a -> Parser a
option (forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String Tag
readTag)
    forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
      [ forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
't'
      , forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"tag"
      , forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"KEY=[VALUE]"
      , forall (f :: * -> *) a. String -> Mod f a
help String
"Override the given Tag for this operation"
      ]

readTag :: String -> Either String Tag
readTag :: String -> Either String Tag
readTag String
s = case Text -> Text -> (Text, Text)
T.breakOn Text
"=" Text
t of
  (Text
_, Text
v) | Text -> Bool
T.null Text
v -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"No '=' found (" forall a. Semigroup a => a -> a -> a
<> String
s forall a. Semigroup a => a -> a -> a
<> String
")"
  (Text
k, Text
_) | Text -> Bool
T.null Text
k -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"Empty key (" forall a. Semigroup a => a -> a -> a
<> String
s forall a. Semigroup a => a -> a -> a
<> String
")"
  (Text
k, Text
"=") -> forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> Text -> Tag
newTag Text
k Text
""
  (Text
k, Text
v) -> forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> Text -> Tag
newTag Text
k forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text
T.drop Int
1 Text
v
 where
  t :: Text
t = String -> Text
pack String
s