remote: thread ProtoVersion into logger

This commit is contained in:
Richard Marko 2023-11-26 14:25:52 +01:00 committed by sorki
parent 241fa58737
commit 76a8632d9c
4 changed files with 19 additions and 10 deletions

View File

@ -9,22 +9,26 @@ import System.Nix.Store.Remote.Serialize.Prim (putByteString)
import System.Nix.Store.Remote.Serializer (logger, runSerialT)
import System.Nix.Store.Remote.Socket (sockGet8, sockPut)
import System.Nix.Store.Remote.MonadStore (MonadStore, clearData)
import System.Nix.Store.Remote.Types (Logger(..))
import System.Nix.Store.Remote.Types (Logger(..), ProtoVersion, hasProtoVersion)
import qualified Control.Monad.Reader
import qualified Control.Monad.State.Strict
import qualified Data.Serialize.Get
import qualified Data.Serializer
processOutput :: MonadStore [Logger]
processOutput = do
sockGet8 >>= go . decoder
protoVersion <- Control.Monad.Reader.asks hasProtoVersion
sockGet8 >>= go . (decoder protoVersion)
where
decoder :: ByteString -> Result (Either () Logger)
decoder =
decoder :: ProtoVersion -> ByteString -> Result (Either () Logger)
decoder protoVersion =
Data.Serialize.Get.runGetPartial
(runSerialT () $ Data.Serializer.getS logger)
(runSerialT protoVersion $ Data.Serializer.getS logger)
go :: Result (Either () Logger) -> MonadStore [Logger]
go (Done ectrl _leftover) = do
protoVersion <- Control.Monad.Reader.asks hasProtoVersion
case ectrl of
-- TODO: tie this with throwError and better error type
Left e -> error $ show e
@ -41,11 +45,11 @@ processOutput = do
sockPut $ putByteString part
clearData
sockGet8 >>= go . decoder
sockGet8 >>= go . (decoder protoVersion)
-- we should probably handle Read here as well
x -> do
next <- sockGet8 >>= go . decoder
next <- sockGet8 >>= go . (decoder protoVersion)
pure $ x : next
go (Partial k) = do
chunk <- sockGet8

View File

@ -248,7 +248,9 @@ errorInfo = liftSerialize
loggerOpCode :: NixSerializer r e LoggerOpCode
loggerOpCode = liftSerialize
logger :: NixSerializer r e Logger
logger
:: HasProtoVersion r
=> NixSerializer r e Logger
logger = Serializer
{ getS = getS loggerOpCode >>= \case
LoggerOpCode_Next ->

View File

@ -14,3 +14,6 @@ data ProtoVersion = ProtoVersion
class HasProtoVersion r where
hasProtoVersion :: r -> ProtoVersion
instance HasProtoVersion ProtoVersion where
hasProtoVersion = id

View File

@ -17,7 +17,7 @@ import System.Nix.Arbitrary ()
import System.Nix.Derivation (Derivation(inputDrvs))
import System.Nix.Store.Remote.Arbitrary ()
import System.Nix.Store.Remote.Serializer
import System.Nix.Store.Remote.Types (ErrorInfo(..), Trace(..))
import System.Nix.Store.Remote.Types (ErrorInfo(..), ProtoVersion, Trace(..))
-- | Test for roundtrip using @NixSerializer@
roundtripSReader
@ -109,4 +109,4 @@ spec = parallel $ do
$ roundtripS errorInfo
prop "LoggerOpCode" $ roundtripS loggerOpCode
prop "Verbosity" $ roundtripS verbosity
prop "Logger" $ roundtripS logger
prop "Logger" $ roundtripSReader @ProtoVersion logger