module Data.JSON (
  fromJSON
, toJSON
, parseJSON
, get
) where

import           Data.Data
import           Data.ByteString (ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Data.HashMap.Strict as H
import           Data.Text (Text)
import           Data.Attoparsec (parse, maybeResult)
import           Data.Aeson (Value(..), Result(..), json')
import qualified Data.Aeson.Encode as E

import qualified Data.JSON.Generic as G

parseJSON :: ByteString -> Maybe Value
parseJSON = maybeResult . parse json'

fromJSON :: Data a => Value -> Maybe a
fromJSON v = case G.fromJSON v of
  Success a -> Just a
  Error _   -> Nothing

toJSON :: (Data a) => a -> ByteString
toJSON = B.concat . L.toChunks . E.encode . G.toJSON

get :: Text -> Value -> Maybe Value
get k v = case v of
  Object o -> H.lookup k o
  _ -> Nothing