{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} {-# LANGUAGE TypeOperators, DataKinds #-} {-# LANGUAGE OverloadedStrings #-} module Thermoprint.API ( PrinterStatus(..) , JobStatus(..) , ThermoprintAPI , thermoprintAPI , module Thermoprint.Identifiers , module Thermoprint.Printout ) where import Thermoprint.Printout import Thermoprint.Identifiers import Servant.API import Servant.Docs import Data.Aeson import Data.Set (Set) import Data.Sequence (Seq) import GHC.Generics (Generic) import Data.Proxy (Proxy(..)) import Data.Functor.Identity (Identity(..)) 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 thermoprintAPI = Proxy