11{-# LANGUAGE DataKinds #-}
22{-# LANGUAGE ScopedTypeVariables #-}
33{-# LANGUAGE TypeApplications #-}
4+ {-# LANGUAGE FlexibleContexts #-}
45module System.Nix.Store.Remote.Protocol (
56 WorkerOp (.. )
67 , simpleOp
@@ -14,6 +15,7 @@ import Control.Exception (bracket)
1415import Control.Monad.Except
1516import Control.Monad.Reader
1617import Control.Monad.State
18+ import Control.Monad.Trans.Control (MonadBaseControl , liftBaseOp )
1719
1820import Data.Binary.Get
1921import Data.Binary.Put
@@ -112,25 +114,27 @@ opNum AddToStoreNar = 39
112114opNum QueryMissing = 40
113115
114116
115- simpleOp :: WorkerOp -> MonadStore Bool
117+ simpleOp :: ( MonadIO m ) => WorkerOp -> MonadStoreT m Bool
116118simpleOp op = do
117119 simpleOpArgs op $ return ()
118120
119- simpleOpArgs :: WorkerOp -> Put -> MonadStore Bool
121+ simpleOpArgs :: ( MonadIO m ) => WorkerOp -> Put -> MonadStoreT m Bool
120122simpleOpArgs op args = do
121123 runOpArgs op args
122124 err <- gotError
123125 case err of
124126 True -> do
125- Error _num msg <- head <$> getError
126- throwError $ Data.ByteString.Char8. unpack msg
127+ err <- head <$> getError
128+ case err of
129+ Error _num msg -> throwError $ Data.ByteString.Char8. unpack msg
130+ _ -> throwError $ " Well, it should really be an error by now"
127131 False -> do
128132 sockGetBool
129133
130- runOp :: WorkerOp -> MonadStore ()
134+ runOp :: ( MonadIO m ) => WorkerOp -> MonadStoreT m ()
131135runOp op = runOpArgs op $ return ()
132136
133- runOpArgs :: WorkerOp -> Put -> MonadStore ()
137+ runOpArgs :: ( MonadIO m ) => WorkerOp -> Put -> MonadStoreT m ()
134138runOpArgs op args = do
135139
136140 -- Temporary hack for printing the messages destined for nix-daemon socket
@@ -144,18 +148,21 @@ runOpArgs op args = do
144148 args
145149
146150 out <- processOutput
147- modify (\ (a, b) -> (a, b++ out))
151+ NixStore $ modify (\ (a, b) -> (a, b++ out))
148152 err <- gotError
149153 when err $ do
150- Error _num msg <- head <$> getError
151- throwError $ Data.ByteString.Char8. unpack msg
154+ err <- head <$> getError
155+ case err of
156+ Error _num msg -> throwError $ Data.ByteString.Char8. unpack msg
157+ _ -> throwError $ " Well, it should really be an error by now"
152158
153- runStore :: MonadStore a -> IO (Either String a , [Logger ])
159+
160+ runStore :: (MonadIO m , MonadBaseControl IO m ) => MonadStoreT m a -> m (Either String a , [Logger ])
154161runStore = runStoreOpts defaultSockPath " /nix/store"
155162
156- runStoreOpts :: FilePath -> FilePath -> MonadStore a -> IO (Either String a , [Logger ])
163+ runStoreOpts :: ( MonadIO m , MonadBaseControl IO m ) => FilePath -> FilePath -> MonadStoreT m a -> m (Either String a , [Logger ])
157164runStoreOpts sockPath storeRootDir code = do
158- bracket (open sockPath) (Network.Socket. close . storeSocket) run
165+ liftBaseOp ( bracket (open sockPath) (Network.Socket. close . storeSocket) ) run
159166 where
160167 open path = do
161168 soc <-
@@ -168,9 +175,10 @@ runStoreOpts sockPath storeRootDir code = do
168175 return $ StoreConfig { storeSocket = soc
169176 , storeDir = storeRootDir }
170177
178+ greet :: MonadIO m => MonadStoreT m [Logger ]
171179 greet = do
172180 sockPut $ putInt workerMagic1
173- soc <- storeSocket <$> ask
181+ soc <- storeSocket <$> NixStore ask
174182 vermagic <- liftIO $ recv soc 16
175183 let (magic2, _daemonProtoVersion) =
176184 flip runGet (Data.ByteString.Lazy. fromStrict vermagic)
@@ -188,4 +196,5 @@ runStoreOpts sockPath storeRootDir code = do
188196 fmap (\ (res, (_data, logs)) -> (res, logs))
189197 $ flip runReaderT sock
190198 $ flip runStateT (Nothing , [] )
191- $ runExceptT (greet >> code)
199+ $ runExceptT
200+ $ unStore (greet >> code)
0 commit comments