module Main ( main ) where import Data.ByteString.Char8 (pack) import Data.Version (showVersion) import Database.MySQL.Base (ConnectInfo(..)) import Database.MySQL.Base.Types (Option(ReadDefaultFile, ReadDefaultGroup)) import Paths_juandelacosa (getDataDir, version) -- from cabal import System.IO.Unsafe (unsafePerformIO) import Options.Applicative ( Parser , (<**>) , (<|>) , auto , execParser , fullDesc , header , help , helper , info , long , metavar , option , optional , short , showDefault , strOption , value ) import Server (Listen(Port, Socket), server) data Config = Config { file :: Maybe FilePath , group :: String , datadir :: FilePath , listen :: Listen } parseListen :: Parser Listen parseListen = port <|> socket where port = Port <$> option auto (long "port" <> short 'p' <> metavar "INT" <> help "listen on this TCP port (localhost only)") socket = Socket <$> option auto (long "socket" <> short 's' <> metavar "PATH" <> value "/tmp/juandelacosa.sock" <> showDefault <> help "Listen on this UNIX-socket") {-# NOINLINE dataDir #-} dataDir :: FilePath dataDir = unsafePerformIO getDataDir parseConfig :: Parser Config parseConfig = Config <$> optional (strOption (long "file" <> short 'f' <> metavar "FILE" <> help "Read this MySQL client config file")) <*> strOption (long "group" <> short 'g' <> metavar "STRING" <> value "client" <> showDefault <> help "Read this options group in the above file") <*> strOption (long "datadir" <> short 'd' <> metavar "DIR" <> value dataDir <> showDefault <> help "Data directory including static files") <*> parseListen run :: Config -> IO () run cfg = do let myInfo = ConnectInfo { connectDatabase = "" , connectHost = "" , connectOptions = case file cfg of Nothing -> [] Just f -> [ReadDefaultFile f, ReadDefaultGroup (pack $ group cfg)] , connectPassword = "" , connectPath = "" , connectPort = 0 , connectSSL = Nothing , connectUser = "" } server (listen cfg) myInfo (datadir cfg) main :: IO () main = run =<< execParser opts where opts = info (parseConfig <**> helper) (fullDesc <> header desc) desc = "juandelacosa " ++ showVersion version ++ " - manage MariaDB user and roles"