packages feed

synapse-cc-0.1.0.0: src/SynapseCC/CLI.hs

-- | Command-line interface parsing
module SynapseCC.CLI
  ( parseArgs
  , versionInfo
  ) where

import Data.Text (Text)
import qualified Data.Text as T
import Options.Applicative
import System.FilePath ((</>))

import SynapseCC.Types

-- ============================================================================
-- CLI Parser
-- ============================================================================

-- | Parse command-line arguments into Config
parseArgs :: IO Config
parseArgs = execParser opts
  where
    opts = info (configParser <**> helper)
      ( fullDesc
     <> progDesc "Unified compiler toolchain for Plexus backends"
     <> header "synapse-cc - from schema to compiled client in one command"
      )

-- | Main config parser
configParser :: Parser Config
configParser = Config
  <$> targetParser
  <*> backendParser
  <*> hostParser
  <*> portParser
  <*> optionsParser

-- | Parse target language
targetParser :: Parser Target
targetParser = argument readTarget
  ( metavar "TARGET"
 <> help "Target language (typescript, python, rust)"
  )
  where
    readTarget = maybeReader $ \case
      "typescript" -> Just TypeScript
      "ts"         -> Just TypeScript
      "python"     -> Just Python
      "py"         -> Just Python
      "rust"       -> Just Rust
      "rs"         -> Just Rust
      _            -> Nothing

-- | Parse backend name
backendParser :: Parser Backend
backendParser = Backend . T.pack <$> argument str
  ( metavar "BACKEND"
 <> help "Backend identifier (substrate, plexus, synapse, etc.)"
  )

-- | Parse registry host
hostParser :: Parser Text
hostParser = T.pack <$> option str
  ( long "host"
 <> short 'H'
 <> metavar "HOST"
 <> value "127.0.0.1"
 <> showDefault
 <> help "Registry/discovery host"
  )

-- | Parse registry port
portParser :: Parser Text
portParser = T.pack <$> option str
  ( long "port"
 <> short 'P'
 <> metavar "PORT"
 <> value "4444"
 <> showDefault
 <> help "Registry/discovery port"
  )

-- | Parse options
optionsParser :: Parser Options
optionsParser = Options
  <$> option str
      ( long "output"
     <> short 'o'
     <> metavar "DIR"
     <> value (optOutput defaultOptions)
     <> showDefault
     <> help "Output directory"
      )
  <*> option auto
      ( long "bundle-transport"
     <> metavar "BOOL"
     <> value (optBundleTransport defaultOptions)
     <> showDefault
     <> help "Bundle transport code (true/false)"
      )
  <*> flag True False
      ( long "no-install"
     <> help "Skip dependency installation"
      )
  <*> flag True False
      ( long "no-build"
     <> help "Skip compilation step"
      )
  <*> flag True False
      ( long "no-tests"
     <> help "Skip running smoke tests"
      )
  <*> option str
      ( long "cache-dir"
     <> metavar "DIR"
     <> value (optCacheDir defaultOptions)
     <> showDefault
     <> help "Cache directory"
      )
  <*> switch
      ( long "force"
     <> help "Force regeneration (ignore cache)"
      )
  <*> switch
      ( long "watch"
     <> help "Watch backend and regenerate on changes"
      )
  <*> switch
      ( long "debug"
     <> help "Enable debug logging"
      )

-- ============================================================================
-- Version Info
-- ============================================================================

-- | Version information
versionInfo :: Text
versionInfo = "synapse-cc v0.1.0"