-- -- Main module of ALGA describes logic of the program on top level. -- -- Copyright © 2015–2016 Mark Karpov -- -- ALGA is free software: you can redistribute it and/or modify it under the -- terms of the GNU General Public License as published by the Free Software -- Foundation, either version 3 of the License, or (at your option) any -- later version. -- -- ALGA is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -- details. -- -- You should have received a copy of the GNU General Public License along -- with this program. If not, see . module Main (main) where import Alga.Configuration import Alga.Interaction import Alga.Translation (toBackend) import Control.Monad import Control.Monad.IO.Class import Data.Text.Lazy (Text) import Data.Version (showVersion) import Formatting import Numeric.Natural import Options.Applicative import Path.IO import Paths_alga (version) import qualified Data.Text.Lazy.IO as T -- | ALGA application command line options. data Opts = Opts { opInterac :: Bool -- ^ Do we run in interactive mode? , opBackend :: String -- ^ Which backend to use? , opSeed :: Natural -- ^ Seed for random number generator , opBeats :: Double -- ^ Duration as number of whole notes , opTarget :: String -- ^ XML file for patching , opLicense :: Bool -- ^ Whether to show license , opVersion :: Bool -- ^ Whether to show program's version , opFiles :: [FilePath] -- ^ Source files to load } -- | Entry point for the whole thing. main :: IO () main = execParser opts >>= f where f Opts { opLicense = True } = T.putStr license f Opts { opVersion = True } = fprint ("ALGA " % string % "\n") ver f Opts { opFiles = [] , opBackend = β } = g β interaction f Opts { opInterac = True , opBackend = β , opFiles = ns } = g β $ cmdLoad ns >> interaction f Opts { opBackend = β , opSeed = s , opBeats = b , opTarget = trg , opFiles = ns } = g β $ cmdLoad ns >> cmdMake s b trg g β x = T.putStrLn notice >> runAlga' (ξ β >> x) ξ β = unless (null β) (cmdBackend β) ver = showVersion version -- | Shortish copyright notice. notice :: Text notice = "ALGA Copyright © 2015–2016 Mark Karpov\n\n\ \This program comes with ABSOLUTELY NO WARRANTY. This is free software,\n\ \and you are welcome to redistribute it under certain conditions; see\n\ \GNU General Public License for details.\n" -- | Longer copyright notice. license :: Text license = "ALGA — algorithmic automation for various DAWs.\n\ \Copyright © 2015–2016 Mark Karpov\n\ \\n\ \ALGA is free software: you can redistribute it and/or modify it under the\n\ \terms of the GNU General Public License as published by the Free Software\n\ \Foundation, either version 3 of the License, or (at your option) any\n\ \later version.\n\ \\n\ \ALGA is distributed in the hope that it will be useful, but WITHOUT ANY\n\ \WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n\ \FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n\ \details.\n\ \\n\ \You should have received a copy of the GNU General Public License along\n\ \with this program. If not, see .\n" -- | Read configuration file if present and run ALGA monad. runAlga' :: Alga a -> IO () runAlga' e = do configFile <- resolveFile' ".alga.yaml" configExists <- doesFileExist configFile c <- if configExists then do econfig <- parseAlgaConfig configFile case econfig of Left msg -> liftIO (putStrLn msg) >> return def Right val -> return val else return def srcFile <- makeAbsolute (configSrcFile c) void $ runAlga e AlgaSt { stBackend = toBackend (configBackend c) , stPrevLen = configPrevLen c , stSrcFile = srcFile } AlgaCfg { cfgPrecision = configPrecision c , cfgPrompt = configPrompt c , cfgVerbose = configVerbose c } -- | Some information about the program. opts :: ParserInfo Opts opts = info (helper <*> options) ( fullDesc <> progDesc "starts ALGA interpreter or patches given XML file" <> header "alga — algorithmic automation for various DAWs" ) -- | Description of command line options. options :: Parser Opts options = Opts <$> switch ( long "interactive" <> short 'i' <> help "Start ALGA in interactive mode" ) <*> strOption ( long "backend" <> short 'B' <> metavar "DAW" <> value "" <> help "Specify which backend to use" ) <*> option auto ( long "seed" <> short 's' <> metavar "SEED" <> value defaultSeed <> help ("Set seed for random numbers, default is " ++ show defaultSeed) ) <*> option auto ( long "beats" <> short 'b' <> metavar "BEATS" <> value defaultBeats <> help ("Set total time in whole notes, default is " ++ show defaultBeats) ) <*> strOption ( long "target" <> short 't' <> metavar "TARGET" <> value "" <> help "Specify target XML file for patching" ) <*> switch ( long "license" <> help "Show license of the program" ) <*> switch ( long "version" <> help "Show version of the program" ) <*> many (strArgument $ metavar "FILES")