{-# LANGUAGE CPP, ExistentialQuantification, ViewPatterns, RecursiveDo #-}
module Curly.Session.Commands.Run where

import Curly.Core
import Curly.Core.Annotated
import Curly.Core.Library
import Curly.UI.Options hiding (nbsp,spc)
import Curly.Core.Parser
import Curly.Core.Documentation
import Curly.System
import Language.Format hiding (space)
import Curly.Session.Commands.Common
import Curly.UI

runCmd :: Interactive Command
runDoc = unlines [
  "{section {title Run Curly Expression (Experimental)}",
  "  {p {em Usage:} run EXPRESSION {em OR} run PATH}",
  "  {p Runs a Curly expression.}}"
  ]
runCmd = withDoc runDoc $ False <$ do
  nbsp >> (runExpr <+? runSym)
  where runExpr = do
          e <- between (single '(') (single ')') (accessorExpr HorizSpaces)
          l <- getSession this
          liftIOWarn $ doRun (anonymous (exprIn l e))
        runSym = do
          p <- absPath ""
          withMountain $ case localContext^?atMs p of
            Just (Pure (_,v)) -> liftIOWarn $ doRun (anonymous (v^.leafVal))
            _ -> guardWarn Sev_Error ("The path "+showSymPath p+" doesn't point to a runnable function") False
        doRun ex = do
          logLine Verbose $ "Running expression "+pretty (semantic ex :: Expression GlobalID (Symbol GlobalID))
          runIt <- jitExpr (?curlyPlex^.jitContext) ex
          ret <- runIt
          logLine Verbose $ "Return value: "+show ret