module Patrol.Extra.Aeson where

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as Key
import qualified Data.Aeson.Types as Aeson
import qualified Data.Text as Text

intoObject :: [Aeson.Pair] -> Aeson.Value
intoObject :: [Pair] -> Value
intoObject = [Pair] -> Value
Aeson.object ([Pair] -> Value) -> ([Pair] -> [Pair]) -> [Pair] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Pair -> Bool) -> [Pair] -> [Pair]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (Pair -> Bool) -> Pair -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Bool
isEmpty (Value -> Bool) -> (Pair -> Value) -> Pair -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pair -> Value
forall a b. (a, b) -> b
snd)

isEmpty :: Aeson.Value -> Bool
isEmpty :: Value -> Bool
isEmpty Value
value = case Value
value of
  Aeson.Array Array
array -> Array -> Bool
forall a. Vector a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Array
array
  Value
Aeson.Null -> Bool
True
  Aeson.Object Object
object -> Object -> Bool
forall a. KeyMap a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Object
object
  Aeson.String Text
string -> Text -> Bool
Text.null Text
string
  Value
_ -> Bool
False

pair :: (Aeson.ToJSON a) => String -> a -> Aeson.Pair
pair :: forall a. ToJSON a => String -> a -> Pair
pair = Key -> a -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
(Aeson..=) (Key -> a -> Pair) -> (String -> Key) -> String -> a -> Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Key
Key.fromString