packages feed

mywork-1.0.1.0: lib/Defs/JSON.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Defs.JSON () where

import Control.Applicative ( (<|>) )
import Data.Aeson

import Defs
import Defs.Static ()


instance ToJSON ProjectName where toJSON (ProjectName pnm) = toJSON pnm
instance ToJSON LocationSpec where
  toJSON = genericToJSON locationSpecOptions
instance ToJSON (Projects_ ())
instance ToJSON (Project_ ()) where
  toJSON = genericToJSON projectOptions
instance ToJSON Group
instance ToJSON Role
instance ToJSON Language
instance ToJSON (Location_ ()) where
  toJSON = genericToJSON locationOptions
instance ToJSON (Note_ ()) where
  toJSON = genericToJSON noteOptions

instance FromJSON ProjectName where parseJSON = fmap ProjectName . parseJSON
instance FromJSON LocationSpec where
  parseJSON = genericParseJSON locationSpecOptions
instance FromJSON (Projects_ ())
instance FromJSON (Project_ ()) where
  parseJSON = withObject "Project" $ \v -> Project
    <$> (v .: "name" <|> v .: "projName")
    <*> v .:? "group" .!= Personal
    <*> v .: "role"
    <*> v .: "description"
    <*> v .: "language"
    <*> v .: "locations"
    <*> pure Nothing

instance FromJSON Group
instance FromJSON Role
instance FromJSON Language
instance FromJSON (Location_ ()) where
  parseJSON = withObject "Location" $ \v -> Location
    <$> v .: "location"
    <*> v .:? "locatedOn" .!= Nothing
    <*> v .: "notes"
    <*> pure Nothing
instance FromJSON (Note_ ())


projectOptions :: Options
projectOptions = defaultOptions { omitNothingFields = True }

locationOptions :: Options
locationOptions = defaultOptions { omitNothingFields = True }

locationSpecOptions :: Options
locationSpecOptions = defaultOptions { sumEncoding = UntaggedValue }

noteOptions :: Options
noteOptions = defaultOptions { omitNothingFields = True }