{-# LANGUAGE CPP                #-}
{-# LANGUAGE DeriveAnyClass     #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}

module Database.Vault.KVv2.Client.Types where

import           Control.Monad        (mzero)
import           Data.Aeson
#if MIN_VERSION_aeson(2,0,0)
import qualified Data.Aeson.Key       as K
import qualified Data.Aeson.KeyMap    as KM
#endif
import qualified Data.ByteString      as B
import           Data.HashMap.Strict
import           Data.Hashable
import           Data.Scientific
import qualified Data.Text            as T
import           Data.Text.Read       (decimal)
import           GHC.Generics
import           Network.HTTP.Client  (Manager)

import           Database.Vault.KVv2.Client.Internal

type VaultToken = String

type Error = String

data VaultConnection =
  VaultConnection
    { VaultConnection -> String
vaultAddr    :: !String
    , VaultConnection -> String
kvEnginePath :: !String
    , VaultConnection -> ByteString
vaultToken   :: !B.ByteString
    , VaultConnection -> Manager
manager      :: !Manager
    }

instance Show VaultConnection where
  show :: VaultConnection -> String
show (VaultConnection String
a String
p ByteString
_ Manager
_) =
    ShowS
removeTrailingSlash String
a String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"/v1/"
    String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
removeTrailingSlash (ShowS
removeLeadingSlash String
p)

newtype SecretVersions =
  SecretVersions [SecretVersion]
  deriving (Int -> SecretVersions -> ShowS
[SecretVersions] -> ShowS
SecretVersions -> String
(Int -> SecretVersions -> ShowS)
-> (SecretVersions -> String)
-> ([SecretVersions] -> ShowS)
-> Show SecretVersions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretVersions] -> ShowS
$cshowList :: [SecretVersions] -> ShowS
show :: SecretVersions -> String
$cshow :: SecretVersions -> String
showsPrec :: Int -> SecretVersions -> ShowS
$cshowsPrec :: Int -> SecretVersions -> ShowS
Show, SecretVersions -> SecretVersions -> Bool
(SecretVersions -> SecretVersions -> Bool)
-> (SecretVersions -> SecretVersions -> Bool) -> Eq SecretVersions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SecretVersions -> SecretVersions -> Bool
$c/= :: SecretVersions -> SecretVersions -> Bool
== :: SecretVersions -> SecretVersions -> Bool
$c== :: SecretVersions -> SecretVersions -> Bool
Eq)

instance ToJSON SecretVersions where
  toJSON :: SecretVersions -> Value
toJSON (SecretVersions [SecretVersion]
svs) =
    [Pair] -> Value
object
      [ Key
"versions" Key -> [Int] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ((\(SecretVersion Int
i) -> Int
i) (SecretVersion -> Int) -> [SecretVersion] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SecretVersion]
svs) ]

newtype SecretVersion
  = SecretVersion Int
  deriving (Int -> SecretVersion -> ShowS
[SecretVersion] -> ShowS
SecretVersion -> String
(Int -> SecretVersion -> ShowS)
-> (SecretVersion -> String)
-> ([SecretVersion] -> ShowS)
-> Show SecretVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretVersion] -> ShowS
$cshowList :: [SecretVersion] -> ShowS
show :: SecretVersion -> String
$cshow :: SecretVersion -> String
showsPrec :: Int -> SecretVersion -> ShowS
$cshowsPrec :: Int -> SecretVersion -> ShowS
Show, SecretVersion -> SecretVersion -> Bool
(SecretVersion -> SecretVersion -> Bool)
-> (SecretVersion -> SecretVersion -> Bool) -> Eq SecretVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SecretVersion -> SecretVersion -> Bool
$c/= :: SecretVersion -> SecretVersion -> Bool
== :: SecretVersion -> SecretVersion -> Bool
$c== :: SecretVersion -> SecretVersion -> Bool
Eq, (forall x. SecretVersion -> Rep SecretVersion x)
-> (forall x. Rep SecretVersion x -> SecretVersion)
-> Generic SecretVersion
forall x. Rep SecretVersion x -> SecretVersion
forall x. SecretVersion -> Rep SecretVersion x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SecretVersion x -> SecretVersion
$cfrom :: forall x. SecretVersion -> Rep SecretVersion x
Generic, Eq SecretVersion
Eq SecretVersion
-> (Int -> SecretVersion -> Int)
-> (SecretVersion -> Int)
-> Hashable SecretVersion
Int -> SecretVersion -> Int
SecretVersion -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: SecretVersion -> Int
$chash :: SecretVersion -> Int
hashWithSalt :: Int -> SecretVersion -> Int
$chashWithSalt :: Int -> SecretVersion -> Int
$cp1Hashable :: Eq SecretVersion
Hashable)

newtype SecretMetadata =
  SecretMetadata (HashMap SecretVersion Metadata)
  deriving (Int -> SecretMetadata -> ShowS
[SecretMetadata] -> ShowS
SecretMetadata -> String
(Int -> SecretMetadata -> ShowS)
-> (SecretMetadata -> String)
-> ([SecretMetadata] -> ShowS)
-> Show SecretMetadata
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretMetadata] -> ShowS
$cshowList :: [SecretMetadata] -> ShowS
show :: SecretMetadata -> String
$cshow :: SecretMetadata -> String
showsPrec :: Int -> SecretMetadata -> ShowS
$cshowsPrec :: Int -> SecretMetadata -> ShowS
Show, SecretMetadata -> SecretMetadata -> Bool
(SecretMetadata -> SecretMetadata -> Bool)
-> (SecretMetadata -> SecretMetadata -> Bool) -> Eq SecretMetadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SecretMetadata -> SecretMetadata -> Bool
$c/= :: SecretMetadata -> SecretMetadata -> Bool
== :: SecretMetadata -> SecretMetadata -> Bool
$c== :: SecretMetadata -> SecretMetadata -> Bool
Eq)

instance FromJSON SecretMetadata where
  parseJSON :: Value -> Parser SecretMetadata
parseJSON (Object Object
o) =
#if MIN_VERSION_aeson(2,0,0)
    SecretMetadata -> Parser SecretMetadata
forall (f :: * -> *) a. Applicative f => a -> f a
pure (HashMap SecretVersion Metadata -> SecretMetadata
SecretMetadata (HashMap SecretVersion Metadata -> SecretMetadata)
-> ([(SecretVersion, Metadata)] -> HashMap SecretVersion Metadata)
-> [(SecretVersion, Metadata)]
-> SecretMetadata
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(SecretVersion, Metadata)] -> HashMap SecretVersion Metadata
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
fromList ([(SecretVersion, Metadata)] -> SecretMetadata)
-> [(SecretVersion, Metadata)] -> SecretMetadata
forall a b. (a -> b) -> a -> b
$ Pair -> (SecretVersion, Metadata)
forall b. FromJSON b => Pair -> (SecretVersion, b)
trans (Pair -> (SecretVersion, Metadata))
-> [Pair] -> [(SecretVersion, Metadata)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HashMap Key Value -> [Pair]
forall k v. HashMap k v -> [(k, v)]
toList (Object -> HashMap Key Value
forall v. KeyMap v -> HashMap Key v
KM.toHashMap Object
o))
#else
    pure (SecretMetadata . fromList $ trans <$> toList o)
#endif
    where
    trans :: Pair -> (SecretVersion, b)
trans Pair
p =
      case Pair
p of
        (Key
k,j :: Value
j@(Object Object
_)) -> do
#if MIN_VERSION_aeson(2,0,0)
          let Right (Int
i,Text
_) = Reader Int
forall a. Integral a => Reader a
decimal (Key -> Text
K.toText Key
k)
#else
          let Right (i,_) = decimal k
#endif
          let Success b
sv  = Value -> Result b
forall a. FromJSON a => Value -> Result a
fromJSON Value
j
          (Int -> SecretVersion
SecretVersion Int
i,b
sv)
        Pair
_                -> (SecretVersion, b)
forall a. HasCallStack => a
undefined
  parseJSON Value
_          = Parser SecretMetadata
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Metadata =
  Metadata 
    { Metadata -> Bool
destroyed     :: !Bool
    , Metadata -> Text
deletion_time :: !T.Text
    , Metadata -> Text
created_time  :: !T.Text
    } deriving (Int -> Metadata -> ShowS
[Metadata] -> ShowS
Metadata -> String
(Int -> Metadata -> ShowS)
-> (Metadata -> String) -> ([Metadata] -> ShowS) -> Show Metadata
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Metadata] -> ShowS
$cshowList :: [Metadata] -> ShowS
show :: Metadata -> String
$cshow :: Metadata -> String
showsPrec :: Int -> Metadata -> ShowS
$cshowsPrec :: Int -> Metadata -> ShowS
Show, Metadata -> Metadata -> Bool
(Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool) -> Eq Metadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Metadata -> Metadata -> Bool
$c/= :: Metadata -> Metadata -> Bool
== :: Metadata -> Metadata -> Bool
$c== :: Metadata -> Metadata -> Bool
Eq, (forall x. Metadata -> Rep Metadata x)
-> (forall x. Rep Metadata x -> Metadata) -> Generic Metadata
forall x. Rep Metadata x -> Metadata
forall x. Metadata -> Rep Metadata x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Metadata x -> Metadata
$cfrom :: forall x. Metadata -> Rep Metadata x
Generic, [Metadata] -> Encoding
[Metadata] -> Value
Metadata -> Encoding
Metadata -> Value
(Metadata -> Value)
-> (Metadata -> Encoding)
-> ([Metadata] -> Value)
-> ([Metadata] -> Encoding)
-> ToJSON Metadata
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Metadata] -> Encoding
$ctoEncodingList :: [Metadata] -> Encoding
toJSONList :: [Metadata] -> Value
$ctoJSONList :: [Metadata] -> Value
toEncoding :: Metadata -> Encoding
$ctoEncoding :: Metadata -> Encoding
toJSON :: Metadata -> Value
$ctoJSON :: Metadata -> Value
ToJSON, Value -> Parser [Metadata]
Value -> Parser Metadata
(Value -> Parser Metadata)
-> (Value -> Parser [Metadata]) -> FromJSON Metadata
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Metadata]
$cparseJSONList :: Value -> Parser [Metadata]
parseJSON :: Value -> Parser Metadata
$cparseJSON :: Value -> Parser Metadata
FromJSON)

newtype SecretData =
  SecretData
    (HashMap T.Text T.Text)
    deriving (Int -> SecretData -> ShowS
[SecretData] -> ShowS
SecretData -> String
(Int -> SecretData -> ShowS)
-> (SecretData -> String)
-> ([SecretData] -> ShowS)
-> Show SecretData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretData] -> ShowS
$cshowList :: [SecretData] -> ShowS
show :: SecretData -> String
$cshow :: SecretData -> String
showsPrec :: Int -> SecretData -> ShowS
$cshowsPrec :: Int -> SecretData -> ShowS
Show, (forall x. SecretData -> Rep SecretData x)
-> (forall x. Rep SecretData x -> SecretData) -> Generic SecretData
forall x. Rep SecretData x -> SecretData
forall x. SecretData -> Rep SecretData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SecretData x -> SecretData
$cfrom :: forall x. SecretData -> Rep SecretData x
Generic, [SecretData] -> Encoding
[SecretData] -> Value
SecretData -> Encoding
SecretData -> Value
(SecretData -> Value)
-> (SecretData -> Encoding)
-> ([SecretData] -> Value)
-> ([SecretData] -> Encoding)
-> ToJSON SecretData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [SecretData] -> Encoding
$ctoEncodingList :: [SecretData] -> Encoding
toJSONList :: [SecretData] -> Value
$ctoJSONList :: [SecretData] -> Value
toEncoding :: SecretData -> Encoding
$ctoEncoding :: SecretData -> Encoding
toJSON :: SecretData -> Value
$ctoJSON :: SecretData -> Value
ToJSON, Value -> Parser [SecretData]
Value -> Parser SecretData
(Value -> Parser SecretData)
-> (Value -> Parser [SecretData]) -> FromJSON SecretData
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [SecretData]
$cparseJSONList :: Value -> Parser [SecretData]
parseJSON :: Value -> Parser SecretData
$cparseJSON :: Value -> Parser SecretData
FromJSON)

data SecretSettings =
  SecretSettings
    { SecretSettings -> Int
max_versions :: Int
    , SecretSettings -> Bool
cas_required :: Bool
    } deriving (Int -> SecretSettings -> ShowS
[SecretSettings] -> ShowS
SecretSettings -> String
(Int -> SecretSettings -> ShowS)
-> (SecretSettings -> String)
-> ([SecretSettings] -> ShowS)
-> Show SecretSettings
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretSettings] -> ShowS
$cshowList :: [SecretSettings] -> ShowS
show :: SecretSettings -> String
$cshow :: SecretSettings -> String
showsPrec :: Int -> SecretSettings -> ShowS
$cshowsPrec :: Int -> SecretSettings -> ShowS
Show, (forall x. SecretSettings -> Rep SecretSettings x)
-> (forall x. Rep SecretSettings x -> SecretSettings)
-> Generic SecretSettings
forall x. Rep SecretSettings x -> SecretSettings
forall x. SecretSettings -> Rep SecretSettings x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SecretSettings x -> SecretSettings
$cfrom :: forall x. SecretSettings -> Rep SecretSettings x
Generic, [SecretSettings] -> Encoding
[SecretSettings] -> Value
SecretSettings -> Encoding
SecretSettings -> Value
(SecretSettings -> Value)
-> (SecretSettings -> Encoding)
-> ([SecretSettings] -> Value)
-> ([SecretSettings] -> Encoding)
-> ToJSON SecretSettings
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [SecretSettings] -> Encoding
$ctoEncodingList :: [SecretSettings] -> Encoding
toJSONList :: [SecretSettings] -> Value
$ctoJSONList :: [SecretSettings] -> Value
toEncoding :: SecretSettings -> Encoding
$ctoEncoding :: SecretSettings -> Encoding
toJSON :: SecretSettings -> Value
$ctoJSON :: SecretSettings -> Value
ToJSON, Value -> Parser [SecretSettings]
Value -> Parser SecretSettings
(Value -> Parser SecretSettings)
-> (Value -> Parser [SecretSettings]) -> FromJSON SecretSettings
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [SecretSettings]
$cparseJSONList :: Value -> Parser [SecretSettings]
parseJSON :: Value -> Parser SecretSettings
$cparseJSON :: Value -> Parser SecretSettings
FromJSON)
    
newtype SecretPath =
  SecretPath
    { SecretPath -> String
path :: String }
    deriving (Int -> SecretPath -> ShowS
[SecretPath] -> ShowS
SecretPath -> String
(Int -> SecretPath -> ShowS)
-> (SecretPath -> String)
-> ([SecretPath] -> ShowS)
-> Show SecretPath
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecretPath] -> ShowS
$cshowList :: [SecretPath] -> ShowS
show :: SecretPath -> String
$cshow :: SecretPath -> String
showsPrec :: Int -> SecretPath -> ShowS
$cshowsPrec :: Int -> SecretPath -> ShowS
Show, (forall x. SecretPath -> Rep SecretPath x)
-> (forall x. Rep SecretPath x -> SecretPath) -> Generic SecretPath
forall x. Rep SecretPath x -> SecretPath
forall x. SecretPath -> Rep SecretPath x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SecretPath x -> SecretPath
$cfrom :: forall x. SecretPath -> Rep SecretPath x
Generic, [SecretPath] -> Encoding
[SecretPath] -> Value
SecretPath -> Encoding
SecretPath -> Value
(SecretPath -> Value)
-> (SecretPath -> Encoding)
-> ([SecretPath] -> Value)
-> ([SecretPath] -> Encoding)
-> ToJSON SecretPath
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [SecretPath] -> Encoding
$ctoEncodingList :: [SecretPath] -> Encoding
toJSONList :: [SecretPath] -> Value
$ctoJSONList :: [SecretPath] -> Value
toEncoding :: SecretPath -> Encoding
$ctoEncoding :: SecretPath -> Encoding
toJSON :: SecretPath -> Value
$ctoJSON :: SecretPath -> Value
ToJSON)

data CheckAndSet
  = WriteAllowed
  | CreateOnly
  | CurrentVersion !Int
  deriving (Int -> CheckAndSet -> ShowS
[CheckAndSet] -> ShowS
CheckAndSet -> String
(Int -> CheckAndSet -> ShowS)
-> (CheckAndSet -> String)
-> ([CheckAndSet] -> ShowS)
-> Show CheckAndSet
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CheckAndSet] -> ShowS
$cshowList :: [CheckAndSet] -> ShowS
show :: CheckAndSet -> String
$cshow :: CheckAndSet -> String
showsPrec :: Int -> CheckAndSet -> ShowS
$cshowsPrec :: Int -> CheckAndSet -> ShowS
Show, (forall x. CheckAndSet -> Rep CheckAndSet x)
-> (forall x. Rep CheckAndSet x -> CheckAndSet)
-> Generic CheckAndSet
forall x. Rep CheckAndSet x -> CheckAndSet
forall x. CheckAndSet -> Rep CheckAndSet x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CheckAndSet x -> CheckAndSet
$cfrom :: forall x. CheckAndSet -> Rep CheckAndSet x
Generic, [CheckAndSet] -> Encoding
[CheckAndSet] -> Value
CheckAndSet -> Encoding
CheckAndSet -> Value
(CheckAndSet -> Value)
-> (CheckAndSet -> Encoding)
-> ([CheckAndSet] -> Value)
-> ([CheckAndSet] -> Encoding)
-> ToJSON CheckAndSet
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CheckAndSet] -> Encoding
$ctoEncodingList :: [CheckAndSet] -> Encoding
toJSONList :: [CheckAndSet] -> Value
$ctoJSONList :: [CheckAndSet] -> Value
toEncoding :: CheckAndSet -> Encoding
$ctoEncoding :: CheckAndSet -> Encoding
toJSON :: CheckAndSet -> Value
$ctoJSON :: CheckAndSet -> Value
ToJSON)

newtype PutSecretOptions =
  PutSecretOptions
    { PutSecretOptions -> CheckAndSet
cas :: CheckAndSet }
    deriving (Int -> PutSecretOptions -> ShowS
[PutSecretOptions] -> ShowS
PutSecretOptions -> String
(Int -> PutSecretOptions -> ShowS)
-> (PutSecretOptions -> String)
-> ([PutSecretOptions] -> ShowS)
-> Show PutSecretOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutSecretOptions] -> ShowS
$cshowList :: [PutSecretOptions] -> ShowS
show :: PutSecretOptions -> String
$cshow :: PutSecretOptions -> String
showsPrec :: Int -> PutSecretOptions -> ShowS
$cshowsPrec :: Int -> PutSecretOptions -> ShowS
Show)

instance ToJSON PutSecretOptions where
  toJSON :: PutSecretOptions -> Value
toJSON PutSecretOptions { cas :: PutSecretOptions -> CheckAndSet
cas = CheckAndSet
WriteAllowed } = [Pair] -> Value
object []
  toJSON PutSecretOptions { cas :: PutSecretOptions -> CheckAndSet
cas = CheckAndSet
CreateOnly }   = [Pair] -> Value
object [ Key
"cas" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Scientific -> Value
Number Scientific
0.0 ]
  toJSON PutSecretOptions { cas :: PutSecretOptions -> CheckAndSet
cas = CurrentVersion Int
v } =
    [Pair] -> Value
object [ Key
"cas" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Scientific -> Value
Number (String -> Scientific
forall a. Read a => String -> a
read (Int -> String
forall a. Show a => a -> String
show Int
v) :: Scientific) ]

data PutSecretRequestBody =
  PutSecretRequestBody
    { PutSecretRequestBody -> PutSecretOptions
options  :: PutSecretOptions
    , PutSecretRequestBody -> SecretData
put_data :: SecretData
    }

instance ToJSON PutSecretRequestBody where
  toJSON :: PutSecretRequestBody -> Value
toJSON (PutSecretRequestBody PutSecretOptions
os SecretData
sd) =
    [Pair] -> Value
object
      [ Key
"options" Key -> PutSecretOptions -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= PutSecretOptions
os
      , Key
"data"    Key -> SecretData -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= SecretData
sd
      ]

data VaultKey
  = VaultKey    !String
  | VaultFolder !String
  deriving (Int -> VaultKey -> ShowS
[VaultKey] -> ShowS
VaultKey -> String
(Int -> VaultKey -> ShowS)
-> (VaultKey -> String) -> ([VaultKey] -> ShowS) -> Show VaultKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VaultKey] -> ShowS
$cshowList :: [VaultKey] -> ShowS
show :: VaultKey -> String
$cshow :: VaultKey -> String
showsPrec :: Int -> VaultKey -> ShowS
$cshowsPrec :: Int -> VaultKey -> ShowS
Show)