packages feed

elasticsearch-interchange-0.1.0.0: src/Elasticsearch/Aliases/Request.hs

{-# language BangPatterns #-}
{-# language DuplicateRecordFields #-}
{-# language LambdaCase #-}
{-# language MagicHash #-}
{-# language NamedFieldPuns #-}
{-# language OverloadedStrings #-}
{-# language PatternSynonyms #-}

module Elasticsearch.Aliases.Request
  ( Action(..)
  , AddAttributes(..)
  , RemoveAttributes(..)
  , encode
  ) where

import Data.Primitive (SmallArray)
import Data.Text.Short (ShortText)
import Json (pattern (:->))

import qualified Json

-- | The action to be taken with the document.
data Action
  = Add AddAttributes
    -- ^ Add an index to an alias
  | Remove RemoveAttributes
    -- ^ Remove an index from an alias
  deriving (Show)

data AddAttributes = AddAttributes
  { alias :: !ShortText
  , index :: !ShortText
  , isWriteIndex :: !Bool
  } deriving (Show)

data RemoveAttributes = RemoveAttributes
  { alias :: !ShortText
  , index :: !ShortText
  } deriving (Show)

encode :: SmallArray Action -> Json.Value
encode !xs = Json.object1 ("actions" :-> Json.Array (fmap encodeAction xs))

encodeAction :: Action -> Json.Value
encodeAction = \case
  Add x -> encodeAdd x
  Remove x -> encodeRemove x

encodeAdd :: AddAttributes -> Json.Value
encodeAdd AddAttributes{alias,index,isWriteIndex} =
  Json.object1 $ "add" :-> Json.object3
    ("alias" :-> Json.String alias)
    ("index" :-> Json.String index)
    ("is_write_index" :-> (if isWriteIndex then Json.True else Json.False))

encodeRemove :: RemoveAttributes -> Json.Value
encodeRemove RemoveAttributes{alias,index} =
  Json.object1 $ "remove" :-> Json.object2
    ("alias" :-> Json.String alias)
    ("index" :-> Json.String index)