module Network.Starling
( open
, close
, Connection
, Key
, Value
, Result
, ResponseStatus(..)
, set
, get
, delete
, flush
, stats
, version
) where
import Network.Starling.Connection
import Network.Starling.Core hiding
( get
, set
, delete
, add
, replace
, increment
, decrement
, flush
, stat
, version
, quit
)
import qualified Network.Starling.Core as Core
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as BS
type Result a = IO (Either (ResponseStatus, ByteString) a)
set :: Connection -> Key -> Value -> Result ()
set con key value = simpleRequest con (Core.set key value) (const ())
get :: Connection -> Key -> Result ByteString
get con key = simpleRequest con (Core.get key) rsBody
delete :: Connection -> Key -> Result ()
delete con key = simpleRequest con (Core.delete key) (const ())
flush :: Connection -> Result ()
flush con = simpleRequest con Core.flush (const ())
simpleRequest :: Connection -> Request -> (Response -> a) -> Result a
simpleRequest con req f
= do
response <- synchRequest con req
if rsStatus response == NoError
then return . Right . f $ response
else return . errorResult $ response
errorResult response = Left (rsStatus response, rsBody response)
stats :: Connection -> Result [(ByteString,ByteString)]
stats con
= do
resps <- synchRequestMulti con $ Core.stat Nothing
if null resps then error "fatal error in Network.Starling.stats"
else do
let resp = head resps
if rsStatus resp == NoError
then return . Right . unpackStats $ resps
else return $ errorResult resp
where unpackStats = filter (\(x,y) -> not (BS.null x && BS.null y)) .
map (\response -> (rsKey response, rsBody response))
oneStat :: Connection -> Key -> Result ByteString
oneStat con key = simpleRequest con (Core.stat $ Just key) rsBody
version :: Connection -> Result ByteString
version con = simpleRequest con Core.version rsBody