@@ -22,25 +22,32 @@ import System.Nix.StorePath (StoreDir)
2222import System.Nix.Store.Remote.Serializer as RB
2323import System.Nix.Store.Remote.Socket
2424import System.Nix.Store.Remote.Types.StoreRequest as R
25+ import System.Nix.Store.Remote.Types.StoreReply
2526import System.Nix.Store.Remote.Types.StoreConfig (HasStoreSocket (.. ), StoreConfig (.. ), PreStoreConfig (.. ), preStoreConfigToStoreConfig )
2627import System.Nix.Store.Remote.Types.ProtoVersion (HasProtoVersion (.. ), ProtoVersion (.. ))
2728import System.Nix.Store.Remote.Types.Logger (BasicError (.. ), ErrorInfo , Logger (.. ))
28-
2929import System.Nix.Store.Remote.MonadStore (WorkerError (.. ), WorkerException (.. ), RemoteStoreError (.. ), RemoteStoreT , runRemoteStoreT , mapStoreConfig )
3030import System.Nix.Store.Remote.Types.Handshake (ServerHandshakeInput (.. ), ServerHandshakeOutput (.. ))
3131import System.Nix.Store.Remote.Types.ProtoVersion (ourProtoVersion )
3232import System.Nix.Store.Remote.Types.WorkerMagic (WorkerMagic (.. ))
3333
34- type WorkerHelper m = forall a . StoreRequest a -> m a
34+ -- wip
35+ -- import Data.Some (traverseSome)
36+ import Data.Functor.Identity
37+
38+ type WorkerHelper m
39+ = forall a
40+ . ( Show a
41+ , StoreReply a
42+ )
43+ = > StoreRequest a -> m a
3544
3645-- | Run an emulated nix daemon on given socket address.
3746-- The deamon will close when the continuation returns.
3847runDaemonSocket
3948 :: forall m a
4049 . ( MonadIO m
4150 , MonadConc m
42- , MonadError RemoteStoreError m
43- , MonadReader StoreConfig m
4451 )
4552 => StoreDir
4653 -> WorkerHelper m
@@ -63,18 +70,18 @@ runDaemonSocket sd workerHelper lsock k = do
6370 }
6471
6572 -- TODO: this, but without the space leak
66- fmap fst $ concurrently listener $ processConnection workerHelper preStoreConfig
73+ fmap fst
74+ $ concurrently listener
75+ $ processConnection workerHelper preStoreConfig
6776
6877 either absurd id <$> race listener k
6978
7079-- | "main loop" of the daemon for a single connection.
7180--
7281-- this function should take care to not throw errors from client connections.
7382processConnection
74- :: ( MonadIO m
75- , MonadError RemoteStoreError m
76- , MonadReader StoreConfig m
77- )
83+ :: forall m
84+ . MonadIO m
7885 => WorkerHelper m
7986 -> PreStoreConfig
8087 -> m ()
@@ -103,6 +110,22 @@ processConnection workerHelper preStoreConfig = do
103110 -- authHook(*store);
104111 stopWork tunnelLogger
105112
113+ let perform
114+ :: ( Show a
115+ , StoreReply a
116+ )
117+ => StoreRequest a
118+ -> RemoteStoreT StoreConfig m (Identity a )
119+ perform req = do
120+ resp <- bracketLogger tunnelLogger $ lift $ workerHelper req
121+ sockPutS
122+ (mapErrorS
123+ RemoteStoreError_SerializerReply
124+ $ getReplyS
125+ )
126+ resp
127+ pure (Identity resp)
128+
106129 -- Process client requests.
107130 let loop = do
108131 someReq <-
@@ -111,7 +134,26 @@ processConnection workerHelper preStoreConfig = do
111134 RemoteStoreError_SerializerRequest
112135 storeRequest
113136
114- lift $ performOp' workerHelper tunnelLogger someReq
137+ -- • Could not deduce (Show a) arising from a use of ‘perform’
138+ -- and also (StoreReply a)
139+ -- traverseSome perform someReq
140+ void $ do
141+ case someReq of
142+ Some req@ (IsValidPath {}) -> do
143+ -- • Couldn't match type ‘a0’ with ‘Bool’
144+ -- Expected: StoreRequest a0
145+ -- Actual: StoreRequest a
146+ -- • ‘a0’ is untouchable
147+ -- inside the constraints: a ~ Bool
148+ -- bound by a pattern with constructor:
149+ -- IsValidPath :: StorePath -> StoreRequest Bool
150+ -- runIdentity <$> perform req
151+
152+ void $ perform req
153+ pure undefined
154+
155+ _ -> throwError unimplemented
156+
115157 loop
116158 loop
117159
@@ -189,48 +231,9 @@ processConnection workerHelper preStoreConfig = do
189231 , serverHandshakeOutputClientVersion = clientVersion
190232 }
191233
192- simpleOp
193- :: ( MonadIO m
194- , HasStoreSocket r
195- , HasProtoVersion r
196- , MonadError RemoteStoreError m
197- , MonadReader r m
198- )
199- => (StoreRequest () -> m () )
200- -> TunnelLogger r
201- -> m (StoreRequest () )
202- -> m ()
203- simpleOp workerHelper tunnelLogger m = do
204- req <- m
205- bracketLogger tunnelLogger $ workerHelper req
206- sockPutS
207- (mapErrorS
208- RemoteStoreError_SerializerPut
209- bool
210- )
211- True
212-
213- simpleOpRet
214- :: ( MonadIO m
215- , HasStoreSocket r
216- , HasProtoVersion r
217- , MonadError RemoteStoreError m
218- , MonadReader r m
219- )
220- => (StoreRequest a -> m a )
221- -> TunnelLogger r
222- -> NixSerializer r SError a
223- -> m (StoreRequest a )
224- -> m ()
225- simpleOpRet workerHelper tunnelLogger s m = do
226- req <- m
227- resp <- bracketLogger tunnelLogger $ workerHelper req
228- sockPutS
229- (mapErrorS
230- RemoteStoreError_SerializerPut
231- s
232- )
233- resp
234+ {-# WARNING unimplemented "not yet implemented" #-}
235+ unimplemented :: RemoteStoreError
236+ unimplemented = RemoteStoreError_WorkerException $ WorkerException_Error $ WorkerError_NotYetImplemented
234237
235238bracketLogger
236239 :: ( MonadIO m
@@ -248,34 +251,6 @@ bracketLogger tunnelLogger m = do
248251 stopWork tunnelLogger
249252 pure a
250253
251- {-# WARNING unimplemented "not yet implemented" #-}
252- unimplemented :: WorkerException
253- unimplemented = WorkerException_Error $ WorkerError_NotYetImplemented
254-
255- performOp'
256- :: forall m
257- . ( MonadIO m
258- , MonadError RemoteStoreError m
259- , MonadReader StoreConfig m
260- )
261- => WorkerHelper m
262- -> TunnelLogger StoreConfig
263- -> Some StoreRequest
264- -> m ()
265- performOp' workerHelper tunnelLogger op = do
266- let _simpleOp' = simpleOp workerHelper tunnelLogger
267- let simpleOpRet'
268- :: NixSerializer StoreConfig SError a
269- -> m (StoreRequest a )
270- -> m ()
271- simpleOpRet' = simpleOpRet workerHelper tunnelLogger
272-
273- case op of
274- Some (IsValidPath path) -> simpleOpRet' bool $ do
275- pure $ R. IsValidPath path
276-
277- _ -> undefined
278-
279254---
280255
281256data TunnelLogger r = TunnelLogger
0 commit comments