module Network.VaultTool.Types where

import Control.Exception (Exception)
import Data.Aeson
import Data.ByteString (ByteString)
import Data.Text (Text)
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text.Encoding as T

newtype VaultAddress = VaultAddress { unVaultAddress :: Text }
    deriving (Show, Eq, Ord)

newtype VaultUnsealKey = VaultUnsealKey { unVaultUnsealKey :: Text }
    deriving (Show, Eq, Ord)

newtype VaultAuthToken = VaultAuthToken { unVaultAuthToken :: ByteString }
    deriving (Show, Eq, Ord)

instance FromJSON VaultAuthToken where
    parseJSON j = do
        text <- parseJSON j
        pure (VaultAuthToken (T.encodeUtf8 text))

newtype VaultSecretPath = VaultSecretPath { unVaultSecretPath :: Text }
    deriving (Show, Eq, Ord)

data VaultException
    = VaultException
    | VaultException_InvalidAddress ByteString String
    | VaultException_BadStatusCode ByteString String BL.ByteString Int BL.ByteString
    | VaultException_ParseBodyError ByteString String BL.ByteString String
    deriving (Show, Eq)

instance Exception VaultException