From ea079b5ee00f5371bde992a14676374a431371b5 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Mon, 11 Jan 2016 03:34:16 +0000 Subject: More fleshed out API --- spec/src/Thermoprint/API.hs | 69 ++++++++++++++++++++++++++++++++----- spec/src/Thermoprint/Identifiers.hs | 19 ++++++++++ 2 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 spec/src/Thermoprint/Identifiers.hs (limited to 'spec/src') diff --git a/spec/src/Thermoprint/API.hs b/spec/src/Thermoprint/API.hs index f2ffd02..d722903 100644 --- a/spec/src/Thermoprint/API.hs +++ b/spec/src/Thermoprint/API.hs @@ -1,21 +1,74 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving, NoDeriveAnyClass #-} +{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} {-# LANGUAGE TypeOperators, DataKinds #-} +{-# LANGUAGE OverloadedStrings #-} module Thermoprint.API - ( PrinterId(..) - , JobId(..) + ( 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 -newtype PrinterId = PrinterId Integer - deriving (Show, Eq, FromText, ToText, FromJSON, ToJSON) +import Data.Set (Set) +import Data.Sequence (Seq) -newtype JobId = JobId Integer - deriving (Show, Eq, FromText, ToText, FromJSON, ToJSON) +import GHC.Generics (Generic) -type ThermoprintAPI = "print" :> Capture "printerId" PrinterId :> ReqBody '[JSON] Printout :> Post '[JSON] JobId +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 JobInfo = JobInfo + { jobPrinter :: PrinterId + , jobStatus :: JobStatus + } + +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] JobInfo + :<|> 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 diff --git a/spec/src/Thermoprint/Identifiers.hs b/spec/src/Thermoprint/Identifiers.hs new file mode 100644 index 0000000..bd0b7a6 --- /dev/null +++ b/spec/src/Thermoprint/Identifiers.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE GeneralizedNewtypeDeriving, NoDeriveAnyClass #-} + +module Thermoprint.Identifiers + ( PrinterId(..) + , JobId(..) + , DraftId(..) + ) where + +import Servant.API (ToText, FromText) +import Data.Aeson (FromJSON, ToJSON) + +newtype PrinterId = PrinterId Integer + deriving (Show, Eq, Ord, Enum, FromText, ToText, FromJSON, ToJSON) + +newtype JobId = JobId Integer + deriving (Show, Eq, Ord, Enum, FromText, ToText, FromJSON, ToJSON) + +newtype DraftId = DraftId Integer + deriving (Show, Eq, Ord, Enum, FromText, ToText, FromJSON, ToJSON) -- cgit v1.2.3