From 8e0aa7bc156ef813841f258b8c29a3202684fe05 Mon Sep 17 00:00:00 2001 From: Richard Marko Date: Thu, 25 Feb 2021 14:31:12 +0100 Subject: [PATCH] repl: use pushScope to pass results from --eval -E Improve my slopy `input` prototype from f7704b4. ``` hnix --repl --eval -E '{ a = 42; }' hnix> a 42 ``` In a case when argument passed to `-E` is not an attribute set, we can't push it to scope directly, so we wrap it in attribute set under `input` attribute, like previous version. ``` hnix --repl --eval -E '42' hnix> input 42 ``` Related to #292 #172. --- main/Main.hs | 15 ++++++++++++++- main/Repl.hs | 17 ++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/main/Main.hs b/main/Main.hs index c7c29bb87..9e4454de3 100644 --- a/main/Main.hs +++ b/main/Main.hs @@ -29,6 +29,7 @@ import qualified Nix.Eval as Eval import Nix.Fresh.Basic import Nix.Json import Nix.Options.Parser +import Nix.Scope import Nix.Standard import Nix.Thunk.Basic import qualified Nix.Type.Env as Env @@ -102,7 +103,19 @@ main = do if evaluate opts then do val <- Nix.nixEvalExprLoc mpath expr - withNixContext mempty (Repl.main' $ pure val) + fromValueMay val >>= \case + -- val is an AttrsSet, use pushScope to pass it to repl + -- XXX: be explicit about this? infered via pushScope + --Just (as :: AttrSet (StdValue (StandardT (StdIdT IO)))) -> do + Just as -> + withNixContext mempty + $ pushScope as + $ Repl.main + Nothing -> + -- pass value as `input` + withNixContext mempty + $ pushScope (M.singleton "input" val) + $ Repl.main else withNixContext mempty Repl.main process opts mpath expr diff --git a/main/Repl.hs b/main/Repl.hs index 7143f82e1..6b4d9cd94 100644 --- a/main/Repl.hs +++ b/main/Repl.hs @@ -19,7 +19,6 @@ module Repl ( main - , main' ) where import Nix hiding ( exec @@ -30,7 +29,6 @@ import Nix.Utils import Nix.Value.Monad (demand) import qualified Data.List -import qualified Data.Maybe import qualified Data.HashMap.Lazy import Data.Text (Text) import qualified Data.Text @@ -65,13 +63,7 @@ import qualified System.IO.Error -- | Repl entry point main :: (MonadNix e t f m, MonadIO m, MonadMask m) => m () -main = main' Nothing - --- | Principled version allowing to pass initial value for context. --- --- Passed value is stored in context with "input" key. -main' :: (MonadNix e t f m, MonadIO m, MonadMask m) => Maybe (NValue t f m) -> m () -main' iniVal = initState iniVal >>= \s -> flip evalStateT s +main = initState >>= \s -> flip evalStateT s $ System.Console.Repline.evalRepl banner cmd @@ -148,8 +140,8 @@ defReplConfig = ReplConfig } -- | Create initial IState for REPL -initState :: MonadNix e t f m => Maybe (NValue t f m) -> m (IState t f m) -initState mIni = do +initState :: MonadNix e t f m => m (IState t f m) +initState = do builtins <- evalText "builtins" @@ -157,8 +149,7 @@ initState mIni = do pure $ IState Nothing - (Data.HashMap.Lazy.fromList - $ ("builtins", builtins) : fmap ("input",) (Data.Maybe.maybeToList mIni)) + (Data.HashMap.Lazy.fromList $ pure ("builtins", builtins)) defReplConfig { cfgStrict = strict opts , cfgValues = values opts