module DDC.Driver.Command.ToSalt
( cmdToSaltFromFile
, cmdToSaltSourceTetraFromFile
, cmdToSaltSourceTetraFromString
, cmdToSaltCoreFromFile
, cmdToSaltCoreFromString)
where
import DDC.Driver.Command.Compile
import DDC.Driver.Stage
import DDC.Driver.Config
import DDC.Driver.Interface.Source
import DDC.Build.Pipeline
import DDC.Build.Language
import DDC.Core.Fragment
import DDC.Base.Pretty
import System.FilePath
import System.Directory
import Control.Monad.Trans.Except
import Control.Monad.IO.Class
import Control.Monad
import DDC.Build.Interface.Store (Store)
import qualified DDC.Build.Language.Salt as Salt
import qualified DDC.Core.Check as C
cmdToSaltFromFile
:: Config
-> Store
-> FilePath
-> ExceptT String IO ()
cmdToSaltFromFile config store filePath
| ".ds" <- takeExtension filePath
= cmdToSaltSourceTetraFromFile config store filePath
| Just language <- languageOfExtension (takeExtension filePath)
= cmdToSaltCoreFromFile config language filePath
| otherwise
= let ext = takeExtension filePath
in throwE $ "Cannot convert '" ++ ext ++ "' files to Salt."
cmdToSaltSourceTetraFromFile
:: Config
-> Store
-> FilePath
-> ExceptT String IO ()
cmdToSaltSourceTetraFromFile config store filePath
= do
exists <- liftIO $ doesFileExist filePath
when (not exists)
$ throwE $ "No such file " ++ show filePath
cmdCompileRecursive config False store filePath
src <- liftIO $ readFile filePath
cmdToSaltSourceTetraFromString config store (SourceFile filePath) src
cmdToSaltSourceTetraFromString
:: Config
-> Store
-> Source
-> String
-> ExceptT String IO ()
cmdToSaltSourceTetraFromString config store source str
= let
pmode = prettyModeOfConfig $ configPretty config
pipeLoad
= pipeText (nameOfSource source)
(lineStartOfSource source) str
$ stageSourceTetraLoad config source store
[ PipeCoreReannotate (const ())
[ stageTetraToSalt config source
[ stageSaltOpt config source
[ PipeCoreCheck Salt.fragment C.Recon SinkDiscard
[ PipeCoreOutput pmode SinkStdout ]]]]]
in do
errs <- liftIO pipeLoad
case errs of
[] -> return ()
es -> throwE $ renderIndent $ vcat $ map ppr es
cmdToSaltCoreFromFile
:: Config
-> Language
-> FilePath
-> ExceptT String IO ()
cmdToSaltCoreFromFile config language filePath
= do
exists <- liftIO $ doesFileExist filePath
when (not exists)
$ throwE $ "No such file " ++ show filePath
src <- liftIO $ readFile filePath
cmdToSaltCoreFromString config language (SourceFile filePath) src
cmdToSaltCoreFromString
:: Config
-> Language
-> Source
-> String
-> ExceptT String IO ()
cmdToSaltCoreFromString config language source str
| Language bundle <- language
, fragment <- bundleFragment bundle
, profile <- fragmentProfile fragment
= do
let fragName = profileName profile
let pmode = prettyModeOfConfig $ configPretty config
let compile
| fragName == "Tetra"
= liftIO
$ pipeText (nameOfSource source) (lineStartOfSource source) str
$ stageTetraLoad config source
[ stageTetraToSalt config source
[ stageSaltOpt config source
[ PipeCoreCheck Salt.fragment C.Recon SinkDiscard
[ PipeCoreOutput pmode SinkStdout]]]]
| otherwise
= throwE
$ "Cannot convert '" ++ fragName ++ "' modules to Salt."
errs <- compile
case errs of
[] -> return ()
es -> throwE $ renderIndent $ vcat $ map ppr es