11{-# LANGUAGE DataKinds #-}
22{-# LANGUAGE ScopedTypeVariables #-}
33{-# LANGUAGE TypeApplications #-}
4+ {-# LANGUAGE FlexibleContexts #-}
45module System.Nix.Store.Remote.Protocol (
56 WorkerOp (.. )
67 , simpleOp
@@ -15,6 +16,7 @@ import Control.Exception (bracket)
1516import Control.Monad.Except
1617import Control.Monad.Reader
1718import Control.Monad.State
19+ import Control.Monad.Trans.Control (MonadBaseControl , liftBaseOp )
1820
1921import Data.Binary.Get
2022import Data.Binary.Put
@@ -114,25 +116,27 @@ opNum AddToStoreNar = 39
114116opNum QueryMissing = 40
115117
116118
117- simpleOp :: WorkerOp -> MonadStore Bool
119+ simpleOp :: ( MonadIO m ) => WorkerOp -> MonadStoreT m Bool
118120simpleOp op = do
119121 simpleOpArgs op $ return ()
120122
121- simpleOpArgs :: WorkerOp -> Put -> MonadStore Bool
123+ simpleOpArgs :: ( MonadIO m ) => WorkerOp -> Put -> MonadStoreT m Bool
122124simpleOpArgs op args = do
123125 runOpArgs op args
124126 err <- gotError
125127 case err of
126128 True -> do
127- Error _num msg <- head <$> getError
128- throwError $ Data.ByteString.Char8. unpack msg
129+ err <- head <$> getError
130+ case err of
131+ Error _num msg -> throwError $ Data.ByteString.Char8. unpack msg
132+ _ -> throwError $ " Well, it should really be an error by now"
129133 False -> do
130134 sockGetBool
131135
132- runOp :: WorkerOp -> MonadStore ()
136+ runOp :: ( MonadIO m ) => WorkerOp -> MonadStoreT m ()
133137runOp op = runOpArgs op $ return ()
134138
135- runOpArgs :: WorkerOp -> Put -> MonadStore ()
139+ runOpArgs :: ( MonadIO m ) => WorkerOp -> Put -> MonadStoreT m ()
136140runOpArgs op args = runOpArgsIO op (\ encode -> encode $ Data.ByteString.Lazy. toStrict $ runPut args)
137141
138142runOpArgsIO :: WorkerOp -> ((Data.ByteString. ByteString -> MonadStore () ) -> MonadStore () ) -> MonadStore ()
@@ -145,18 +149,21 @@ runOpArgsIO op encoder = do
145149 encoder (liftIO . sendAll soc)
146150
147151 out <- processOutput
148- modify (\ (a, b) -> (a, b++ out))
152+ NixStore $ modify (\ (a, b) -> (a, b++ out))
149153 err <- gotError
150154 when err $ do
151- Error _num msg <- head <$> getError
152- throwError $ Data.ByteString.Char8. unpack msg
155+ err <- head <$> getError
156+ case err of
157+ Error _num msg -> throwError $ Data.ByteString.Char8. unpack msg
158+ _ -> throwError $ " Well, it should really be an error by now"
153159
154- runStore :: MonadStore a -> IO (Either String a , [Logger ])
160+
161+ runStore :: (MonadIO m , MonadBaseControl IO m ) => MonadStoreT m a -> m (Either String a , [Logger ])
155162runStore = runStoreOpts defaultSockPath " /nix/store"
156163
157- runStoreOpts :: FilePath -> FilePath -> MonadStore a -> IO (Either String a , [Logger ])
164+ runStoreOpts :: ( MonadIO m , MonadBaseControl IO m ) => FilePath -> FilePath -> MonadStoreT m a -> m (Either String a , [Logger ])
158165runStoreOpts sockPath storeRootDir code = do
159- bracket (open sockPath) (Network.Socket. close . storeSocket) run
166+ liftBaseOp ( bracket (open sockPath) (Network.Socket. close . storeSocket) ) run
160167 where
161168 open path = do
162169 soc <-
@@ -169,9 +176,10 @@ runStoreOpts sockPath storeRootDir code = do
169176 return $ StoreConfig { storeSocket = soc
170177 , storeDir = storeRootDir }
171178
179+ greet :: MonadIO m => MonadStoreT m [Logger ]
172180 greet = do
173181 sockPut $ putInt workerMagic1
174- soc <- storeSocket <$> ask
182+ soc <- storeSocket <$> NixStore ask
175183 vermagic <- liftIO $ recv soc 16
176184 let (magic2, _daemonProtoVersion) =
177185 flip runGet (Data.ByteString.Lazy. fromStrict vermagic)
@@ -189,4 +197,5 @@ runStoreOpts sockPath storeRootDir code = do
189197 fmap (\ (res, (_data, logs)) -> (res, logs))
190198 $ flip runReaderT sock
191199 $ flip runStateT (Nothing , [] )
192- $ runExceptT (greet >> code)
200+ $ runExceptT
201+ $ unStore (greet >> code)
0 commit comments