@@ -39,13 +39,19 @@ import Data.ByteString (ByteString)
3939import Data.Int (Int8 )
4040import Data.GADT.Show (GShow (.. ), defaultGshowsPrec )
4141import Data.Kind (Type )
42- import Data.Type.Equality
43- import Data.Serialize.Get (getInt8 )
44- import Data.Serialize.Put (putInt8 )
42+ import Data.Type.Equality ( TestEquality ( .. ), (:~:) ( Refl ))
43+ import Data.Serialize.Get (Get , getInt8 )
44+ import Data.Serialize.Put (Putter , PutM , putInt8 )
4545import Data.Serializer
46+ ( Serializer (.. )
47+ , GetSerializerError
48+ , runGetS
49+ , runPutS
50+ , transformGetError
51+ , transformPutError
52+ )
4653import Data.Some (Some (.. ))
47- import GHC.Generics
48- import System.Nix.Store.Remote.Serialize.Prim (getBool , putBool , getEnum , putEnum )
54+ import GHC.Generics (Generic )
4955
5056import Test.QuickCheck (Arbitrary (.. ), oneof )
5157
@@ -274,3 +280,40 @@ cmdSRest = Serializer
274280 else lift (putInt8 i)
275281 Some (Cmd_Bool b) -> putS opcode OpCode_Bool >> lift (putBool b)
276282 }
283+
284+ -- Primitives helpers
285+
286+ getInt :: Integral a => Get a
287+ getInt = fromIntegral <$> getInt8
288+
289+ putInt :: Integral a => Putter a
290+ putInt = putInt8 . fromIntegral
291+
292+ -- | Deserialize @Bool@ from integer
293+ getBool :: Get Bool
294+ getBool = (getInt :: Get Int8 ) >>= \ case
295+ 0 -> pure False
296+ 1 -> pure True
297+ x -> fail $ " illegal bool value " ++ show x
298+
299+ -- | Serialize @Bool@ into integer
300+ putBool :: Putter Bool
301+ putBool True = putInt (1 :: Int8 )
302+ putBool False = putInt (0 :: Int8 )
303+
304+ -- | Utility toEnum version checking bounds using Bounded class
305+ toEnumCheckBounds :: Enum a => Int -> Either String a
306+ toEnumCheckBounds = \ case
307+ x | x < minBound -> Left $ " enum out of min bound " ++ show x
308+ x | x > maxBound -> Left $ " enum out of max bound " ++ show x
309+ x | otherwise -> Right $ toEnum x
310+
311+ -- | Deserialize @Enum@ to integer
312+ getEnum :: Enum a => Get a
313+ getEnum =
314+ toEnumCheckBounds <$> getInt
315+ >>= either fail pure
316+
317+ -- | Serialize @Enum@ to integer
318+ putEnum :: Enum a => Putter a
319+ putEnum = putInt . fromEnum
0 commit comments