packages feed

futhark-0.25.13: src/Futhark/CLI/Script.hs

module Futhark.CLI.Script (main) where

import Control.Monad.Except
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Futhark.CLI.Literate
  ( Options (..),
    initialOptions,
    prepareServer,
    scriptCommandLineOptions,
  )
import Futhark.Script
import Futhark.Util.Options
import Futhark.Util.Pretty (prettyText)
import System.Exit
import System.IO

commandLineOptions :: [FunOptDescr Options]
commandLineOptions =
  scriptCommandLineOptions
    ++ [ Option
           "D"
           ["debug"]
           ( NoArg $ Right $ \config ->
               config
                 { scriptExtraOptions = "-D" : scriptExtraOptions config,
                   scriptVerbose = scriptVerbose config + 1
                 }
           )
           "Enable debugging.",
         Option
           "L"
           ["log"]
           ( NoArg $ Right $ \config ->
               config
                 { scriptExtraOptions = "-L" : scriptExtraOptions config,
                   scriptVerbose = scriptVerbose config + 1
                 }
           )
           "Enable logging."
       ]

-- | Run @futhark script@.
main :: String -> [String] -> IO ()
main = mainWithOptions initialOptions commandLineOptions "program script" $ \args opts ->
  case args of
    [prog, script] -> Just $ do
      script' <- case parseExpFromText "command line argument" $ T.pack script of
        Left e -> do
          T.hPutStrLn stderr e
          exitFailure
        Right x -> pure x
      prepareServer prog opts $ \s -> do
        r <-
          runExceptT $ getExpValue s =<< evalExp (scriptBuiltin ".") s script'
        case r of
          Left e -> do
            T.hPutStrLn stderr e
            exitFailure
          Right v ->
            T.putStrLn $ prettyText v
    _ -> Nothing