Merge pull request #286 from jwiegley/merge257
Pull request for merge257
This commit is contained in:
commit
13f3ebddd4
|
@ -134,6 +134,7 @@ builtinsList = sequence [
|
|||
, add2 Normal "div" div_
|
||||
, add2 Normal "elem" elem_
|
||||
, add2 Normal "elemAt" elemAt_
|
||||
, add Normal "exec" exec_
|
||||
, add0 Normal "false" (return $ nvConstant $ NBool False)
|
||||
, add Normal "fetchTarball" fetchTarball
|
||||
, add2 Normal "filter" filter_
|
||||
|
@ -190,6 +191,7 @@ builtinsList = sequence [
|
|||
, add Normal "toPath" toPath
|
||||
, add TopLevel "toString" toString
|
||||
, add Normal "toXML" toXML_
|
||||
, add2 TopLevel "trace" trace_
|
||||
, add Normal "tryEval" tryEval
|
||||
, add Normal "typeOf" typeOf
|
||||
, add Normal "unsafeDiscardStringContext" unsafeDiscardStringContext
|
||||
|
@ -855,6 +857,17 @@ tryEval e = catch (onSuccess <$> e) (pure . onError)
|
|||
, ("value", valueThunk (nvConstant (NBool False)))
|
||||
]
|
||||
|
||||
trace_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
|
||||
trace_ msg action = do
|
||||
traceEffect . Text.unpack =<< fromValue @Text msg
|
||||
action
|
||||
|
||||
exec_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
|
||||
exec_ xs = do
|
||||
ls <- fromValue @[NThunk m] xs
|
||||
xs <- traverse (fromValue @Text . force') ls
|
||||
exec (map Text.unpack xs)
|
||||
|
||||
fetchTarball :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
|
||||
fetchTarball v = v >>= \case
|
||||
NVSet s _ -> case M.lookup "url" s of
|
||||
|
|
|
@ -32,3 +32,7 @@ class MonadFile m => MonadEffects m where
|
|||
nixInstantiateExpr :: String -> m (NValue m)
|
||||
|
||||
getRecursiveSize :: a -> m (NValue m)
|
||||
|
||||
traceEffect :: String -> m ()
|
||||
|
||||
exec :: [String] -> m (NValue m)
|
||||
|
|
|
@ -583,6 +583,27 @@ instance (MonadFix m, MonadCatch m, MonadIO m, Alternative m,
|
|||
const $ toNix (0 :: Integer)
|
||||
#endif
|
||||
|
||||
traceEffect = liftIO . putStrLn
|
||||
|
||||
exec = \case
|
||||
[] -> throwError $ ErrorCall "exec: missing program"
|
||||
(prog:args) -> do
|
||||
(exitCode, out, _) <-
|
||||
liftIO $ readProcessWithExitCode prog args ""
|
||||
let t = Text.strip (Text.pack out)
|
||||
let emsg = "program[" ++ prog ++ "] args=" ++ show args
|
||||
case exitCode of
|
||||
ExitSuccess ->
|
||||
if Text.null t
|
||||
then throwError $ ErrorCall $ "exec has no output :" ++ emsg
|
||||
else case parseNixTextLoc t of
|
||||
Failure err ->
|
||||
throwError $ ErrorCall $
|
||||
"Error parsing output of exec: " ++ show err ++ " " ++ emsg
|
||||
Success v -> evalExprLoc v
|
||||
err -> throwError $ ErrorCall $
|
||||
"exec failed: " ++ show err ++ " " ++ emsg
|
||||
|
||||
runLazyM :: Options -> MonadIO m => Lazy m a -> m a
|
||||
runLazyM opts = (`evalStateT` M.empty)
|
||||
. (`runReaderT` newContext opts)
|
||||
|
|
Loading…
Reference in a new issue