diff --git a/hnix-store-remote/src/System/Nix/Store/Remote/Arbitrary.hs b/hnix-store-remote/src/System/Nix/Store/Remote/Arbitrary.hs index 7dfde5d..e62519f 100644 --- a/hnix-store-remote/src/System/Nix/Store/Remote/Arbitrary.hs +++ b/hnix-store-remote/src/System/Nix/Store/Remote/Arbitrary.hs @@ -23,5 +23,8 @@ deriving via GenericArbitrary ActivityResult deriving via GenericArbitrary Field instance Arbitrary Field +deriving via GenericArbitrary LoggerOpCode + instance Arbitrary LoggerOpCode + deriving via GenericArbitrary Verbosity instance Arbitrary Verbosity diff --git a/hnix-store-remote/src/System/Nix/Store/Remote/Logger.hs b/hnix-store-remote/src/System/Nix/Store/Remote/Logger.hs index 17446ac..a547da7 100644 --- a/hnix-store-remote/src/System/Nix/Store/Remote/Logger.hs +++ b/hnix-store-remote/src/System/Nix/Store/Remote/Logger.hs @@ -5,8 +5,7 @@ module System.Nix.Store.Remote.Logger ) where import Control.Monad.Except (throwError) -import Control.Monad.State.Strict (get) -import Data.Serialize.Get (Get, Result(..)) +import Data.Serialize (Get, Result(..)) import System.Nix.Store.Remote.Serialize () import System.Nix.Store.Remote.Serialize.Prim import System.Nix.Store.Remote.Socket @@ -14,30 +13,38 @@ import System.Nix.Store.Remote.MonadStore import System.Nix.Store.Remote.Types import qualified Control.Monad +import qualified Control.Monad.State.Strict import qualified Data.Serialize import qualified Data.Serialize.Get controlParser :: Get Logger controlParser = do - ctrl <- getInt - case (ctrl :: Int) of - 0x6f6c6d67 -> Next <$> getByteString - 0x64617461 -> Read <$> getInt - 0x64617416 -> Write <$> getByteString - 0x616c7473 -> pure Last - 0x63787470 -> flip Error <$> getByteString - <*> getInt - 0x53545254 -> StartActivity <$> (ActivityID <$> getInt) - <*> Data.Serialize.get - <*> getInt - <*> getByteString - <*> getFields - <*> (ActivityID <$> getInt) - 0x53544f50 -> StopActivity <$> (ActivityID <$> getInt) - 0x52534c54 -> Result <$> (ActivityID <$> getInt) - <*> getInt - <*> getFields - x -> fail $ "Invalid control message received:" <> show x + ctrl <- Data.Serialize.get + case (ctrl :: LoggerOpCode) of + LoggerOpCode_Next -> + Next <$> getByteString + LoggerOpCode_Read -> + Read <$> getInt + LoggerOpCode_Write -> + Write <$> getByteString + LoggerOpCode_Last -> + pure Last + LoggerOpCode_Error -> + flip Error <$> getByteString + <*> getInt + LoggerOpCode_StartActivity -> + StartActivity <$> (ActivityID <$> getInt) + <*> Data.Serialize.get + <*> getInt + <*> getByteString + <*> getFields + <*> (ActivityID <$> getInt) + LoggerOpCode_StopActivity -> + StopActivity <$> (ActivityID <$> getInt) + LoggerOpCode_Result -> + Result <$> (ActivityID <$> getInt) + <*> getInt + <*> getFields processOutput :: MonadStore [Logger] processOutput = do @@ -50,7 +57,7 @@ processOutput = do e@(Error _ _) -> pure [e] Last -> pure [Last] Read _n -> do - (mdata, _) <- get + (mdata, _) <- Control.Monad.State.Strict.get case mdata of Nothing -> throwError "No data to read provided" Just part -> do diff --git a/hnix-store-remote/src/System/Nix/Store/Remote/Serialize.hs b/hnix-store-remote/src/System/Nix/Store/Remote/Serialize.hs index 77d3fa3..b122948 100644 --- a/hnix-store-remote/src/System/Nix/Store/Remote/Serialize.hs +++ b/hnix-store-remote/src/System/Nix/Store/Remote/Serialize.hs @@ -133,6 +133,10 @@ instance Serialize Field where put (Field_LogInt x) = putInt (0 :: Word8) >> putInt x put (Field_LogStr x) = putInt (1 :: Word8) >> putByteString x +instance Serialize LoggerOpCode where + get = getInt @Int >>= either fail pure . intToLoggerOpCode + put = putInt @Int . loggerOpCodeToInt + instance Serialize Verbosity where get = getEnum put = putEnum diff --git a/hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs b/hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs index 78190e9..f837a2c 100644 --- a/hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs +++ b/hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs @@ -32,6 +32,7 @@ module System.Nix.Store.Remote.Serializer , maybeActivity , activityResult , field + , loggerOpCode , verbosity ) where @@ -220,5 +221,8 @@ activityResult = liftSerialize field :: NixSerializer r e Field field = liftSerialize +loggerOpCode :: NixSerializer r e LoggerOpCode +loggerOpCode = liftSerialize + verbosity :: NixSerializer r e Verbosity verbosity = liftSerialize diff --git a/hnix-store-remote/src/System/Nix/Store/Remote/Types/Logger.hs b/hnix-store-remote/src/System/Nix/Store/Remote/Types/Logger.hs index 79c5ee8..2b6f83c 100644 --- a/hnix-store-remote/src/System/Nix/Store/Remote/Types/Logger.hs +++ b/hnix-store-remote/src/System/Nix/Store/Remote/Types/Logger.hs @@ -1,6 +1,9 @@ module System.Nix.Store.Remote.Types.Logger ( Field(..) , Logger(..) + , LoggerOpCode(..) + , loggerOpCodeToInt + , intToLoggerOpCode , isError -- to be nuked/newtyped , ActivityType @@ -20,8 +23,42 @@ data Field | Field_LogInt Int deriving (Eq, Generic, Ord, Show) -data Logger = - Next ByteString +data LoggerOpCode + = LoggerOpCode_Next + | LoggerOpCode_Read + | LoggerOpCode_Write + | LoggerOpCode_Last + | LoggerOpCode_Error + | LoggerOpCode_StartActivity + | LoggerOpCode_StopActivity + | LoggerOpCode_Result + deriving (Eq, Generic, Ord, Show) + +loggerOpCodeToInt :: LoggerOpCode -> Int +loggerOpCodeToInt = \case + LoggerOpCode_Next -> 0x6f6c6d67 + LoggerOpCode_Read -> 0x64617461 + LoggerOpCode_Write -> 0x64617416 + LoggerOpCode_Last -> 0x616c7473 + LoggerOpCode_Error -> 0x63787470 + LoggerOpCode_StartActivity -> 0x53545254 + LoggerOpCode_StopActivity -> 0x53544f50 + LoggerOpCode_Result -> 0x52534c54 + +intToLoggerOpCode :: Int -> Either String LoggerOpCode +intToLoggerOpCode = \case + 0x6f6c6d67 -> Right LoggerOpCode_Next + 0x64617461 -> Right LoggerOpCode_Read + 0x64617416 -> Right LoggerOpCode_Write + 0x616c7473 -> Right LoggerOpCode_Last + 0x63787470 -> Right LoggerOpCode_Error + 0x53545254 -> Right LoggerOpCode_StartActivity + 0x53544f50 -> Right LoggerOpCode_StopActivity + 0x52534c54 -> Right LoggerOpCode_Result + x -> Left $ "Invalid LoggerOpCode: " ++ show x + +data Logger + = Next ByteString | Read Int -- data needed from source | Write ByteString -- data for sink | Last diff --git a/hnix-store-remote/tests/NixSerializerSpec.hs b/hnix-store-remote/tests/NixSerializerSpec.hs index 6868309..1ca3b5d 100644 --- a/hnix-store-remote/tests/NixSerializerSpec.hs +++ b/hnix-store-remote/tests/NixSerializerSpec.hs @@ -85,4 +85,5 @@ spec = parallel $ do prop "Maybe Activity" $ roundtripS maybeActivity prop "ActivityResult" $ roundtripS activityResult prop "Field" $ roundtripS field + prop "LoggerOpCode" $ roundtripS loggerOpCode prop "Verbosity" $ roundtripS verbosity diff --git a/hnix-store-remote/tests/SerializeSpec.hs b/hnix-store-remote/tests/SerializeSpec.hs index d960f43..836cffc 100644 --- a/hnix-store-remote/tests/SerializeSpec.hs +++ b/hnix-store-remote/tests/SerializeSpec.hs @@ -114,6 +114,7 @@ spec = parallel $ do prop "ActivityID" $ roundtripS @ActivityID prop "Activity" $ roundtripS @Activity prop "Field" $ roundtripS @Field + prop "LoggerOpCode" $ roundtripS @LoggerOpCode prop "Verbosity" $ roundtripS @Verbosity describe "Enums" $ do @@ -165,6 +166,16 @@ spec = parallel $ do it' "SetExpected" ActivityResult_SetExpected 106 it' "PostBuildLogLine" ActivityResult_PostBuildLogLine 107 + describe "LoggerOpCode matches Nix" $ do + it' "Next" LoggerOpCode_Next 0x6f6c6d67 + it' "Read" LoggerOpCode_Read 0x64617461 + it' "Write" LoggerOpCode_Write 0x64617416 + it' "Last" LoggerOpCode_Last 0x616c7473 + it' "Error" LoggerOpCode_Error 0x63787470 + it' "StartActivity" LoggerOpCode_StartActivity 0x53545254 + it' "StopActivity" LoggerOpCode_StopActivity 0x53544f50 + it' "Result" LoggerOpCode_Result 0x52534c54 + describe "Verbosity enum order matches Nix" $ do it' "Error" Verbosity_Error 0 it' "Warn" Verbosity_Warn 1