packages feed

clckwrks-0.28.0.1: Clckwrks/NavBar/Types.hs

{-# LANGUAGE CPP, DeriveGeneric, DeriveDataTypeable, OverloadedStrings, RecordWildCards, TemplateHaskell, FlexibleContexts, UndecidableInstances #-}
module Clckwrks.NavBar.Types where

import Clckwrks.Types (NamedLink(..))
import Data.Aeson     (ToJSON(..), (.=), object)
import Data.Data      (Data, Typeable)
import Data.SafeCopy  (SafeCopy(..), base, contain, deriveSafeCopy, getSafePut, getSafeGet)
import Data.Serialize (label, putWord8, getWord8)
import Data.Text      (Text)
import GHC.Generics   (Generic)

newtype NavBar = NavBar
    { navBarItems :: [NavBarItem]
    }
    deriving (Eq, Read, Show, Data, Typeable, Generic)

data NavBarItem
    = NBLink    NamedLink
    | NBSubNavBar Text NavBar
    deriving (Eq, Read, Show, Data, Typeable, Generic)

#if __GLASGOW_HASKELL >= __900__
instance SafeCopy NavBar where version = 1
instance SafeCopy NavBarItem where version = 1
#else
$(deriveSafeCopy 1 'base ''NavBar)
$(deriveSafeCopy 1 'base ''NavBarItem)
#endif

newtype NavBarLinks = NavBarLinks [(String, [NamedLink])]
    deriving (Eq, Read, Show, Data, Typeable)

instance ToJSON NavBarLinks where
    toJSON (NavBarLinks navBarLinks) =
        toJSON $ map (\(plugName, links) ->
                          object [ "pluginName" .= plugName
                                 , "pluginLinks" .= map toJSON links
                                 ]) navBarLinks