packages feed

haskell-admin-core-1.0.0.0: src/Admin/Components/ComponentList.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Admin.Components.ComponentList
  ( ComponentList(..)
  , namesOf
  , descriptionsOf
  , empty
  ) where

import Admin.Components.ComponentDescription
import Admin.Components.Internal.TypeLevel (ManySymbolVal, manySymbolVal)
import Data.Version
import GHC.TypeLits (Symbol)
import Servant

data ComponentList (names :: [Symbol]) apis =
  ComponentList
    { serveAll :: Server apis
    , versions :: [Version]
    }

namesOf ::
     forall names apis. (ManySymbolVal names)
  => ComponentList names apis
  -> [String]
namesOf _ = manySymbolVal (Proxy :: Proxy names)

descriptionsOf ::
     forall names apis. (ManySymbolVal names)
  => ComponentList names apis
  -> [ComponentDescription]
descriptionsOf cs = zipWith ComponentDescription (namesOf cs) (versions cs)

empty :: ComponentList '[] EmptyAPI
empty = ComponentList emptyServer [makeVersion [1]]