{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} {-# LANGUAGE TypeOperators, DataKinds #-} {-# LANGUAGE OverloadedStrings #-} -- | A specification of an API for interacting with a set of printers module Thermoprint.API ( PrinterStatus(..) , JobStatus(..) , PrintingError(..) , ThermoprintAPI , thermoprintAPI , module Thermoprint.Identifiers , module Thermoprint.Printout ) where import Thermoprint.Printout import Thermoprint.Identifiers import Servant.API import Data.Aeson import Data.Set (Set) import Data.Sequence (Seq) import GHC.Generics (Generic) import Data.Proxy (Proxy(..)) import Control.Exception (Exception) import Data.Typeable (Typeable) data PrinterStatus = Busy JobId | Available deriving (Generic, Show, FromJSON, ToJSON) data JobStatus = Queued | Printing | Done | Failed PrintingError deriving (Generic, Show, FromJSON, ToJSON) data PrintingError = UnknownError deriving (Typeable, Generic, Show, FromJSON, ToJSON, Exception) type ThermoprintAPI = "printers" :> Get '[JSON] (Set PrinterId) :<|> "printer" :> Capture "printerId" PrinterId :> ( ReqBody '[JSON] Printout :> Post '[JSON] JobId :<|> "status" :> Get '[JSON] PrinterStatus ) :<|> "jobs" :> ( QueryParam "printer" PrinterId :> QueryParam "min" JobId :> QueryParam "max" JobId :> Get '[JSON] (Seq JobId) ) :<|> "job" :> Capture "jobId" JobId :> ( Get '[JSON] Printout :<|> "status" :> Get '[JSON] JobStatus :<|> "printer" :> Get '[JSON] PrinterId :<|> Delete '[] () ) :<|> "drafts" :> ( Get '[JSON] (Set DraftId) :<|> ReqBody '[JSON] Printout :> Post '[JSON] DraftId ) :<|> "draft" :> Capture "draftId" DraftId :> ( ReqBody '[JSON] Printout :> Put '[] () :<|> Get '[JSON] Printout :<|> Delete '[] () ) thermoprintAPI :: Proxy ThermoprintAPI -- ^ Servant occasionally needs an object of this type thermoprintAPI = Proxy