content: {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE DeriveGeneric  #-}
  
  module PostgREST.SchemaCache.Representations
    ( DataRepresentation(..)
    , RepresentationsMap
    ) where
  
  import qualified Data.Aeson          as JSON
  import qualified Data.HashMap.Strict as HM
  
  
  import Protolude
  
  -- | Data representations allow user customisation of how to present and receive data through APIs, per field.
  -- This structure is used for the library of available transforms. It answers questions like:
  -- - What function, if any, should be used to present a certain field that's been selected for API output?
  -- - How do we parse incoming data for a certain field type when inserting or updating?
  -- - And similarly, how do we parse textual data in a query string to be used as a filter?
  --
  -- Support for outputting special formats like CSV and binary data would fit into the same system.
  data DataRepresentation = DataRepresentation
    { drSourceType :: Text
    , drTargetType :: Text
    , drFunction   :: Text
    } deriving (Eq, Show, Generic, JSON.ToJSON, JSON.FromJSON)
  
  -- The representation map maps from (source type, target type) to a DR.
  type RepresentationsMap = HM.HashMap (Text, Text) DataRepresentation
  