content: {-# LANGUAGE DeriveDataTypeable #-}
  
  module Main where
  
  import System.Console.CmdArgs
  import TensorSafe.Commands.Check (check)
  import TensorSafe.Commands.Compile (compile)
  import TensorSafe.Commands.Examples (examples)
  
  data Backend = JavaScript | Python deriving (Data, Eq, Show, Typeable)
  
  data TensorSafe
    = Check {path :: FilePath}
    | Compile
        { path :: FilePath,
          module_name :: String,
          backend :: Backend,
          out :: Maybe FilePath
        }
    | Examples
    deriving (Data, Eq, Show, Typeable)
  
  cCheck :: TensorSafe
  cCheck =
    Check
      { path = def &= typ "PATH" &= help "Path to Haskell module with TensorSafe model inside"
      }
      &= help "Checks if a Neural Network model is valid or not"
  
  cCompile :: TensorSafe
  cCompile =
    Compile
      { path = def &= typ "PATH" &= help "Path to Haskell module with TensorSafe model inside",
        module_name = def &= help "The module name inside the TensorSafe model file",
        backend =
          enum
            [ JavaScript &= help "Compile to JavaScript backend",
              Python &= help "Compile to Python backend"
            ],
        out = def &= help "If specified, the output file path to which the network will be generated"
      }
      &= help "Compiles module and outputs Neural Network model for the specified backend"
  
  cExamples :: TensorSafe
  cExamples = Examples &= help "Show some examples"
  
  tensorSafe :: IO TensorSafe
  tensorSafe = cmdArgs (modes [cCompile, cCheck, cExamples])
  
  main :: IO ()
  main = do
    -- print =<< tensorSafe
    r <- tensorSafe
    case r of
      Check {path = p} -> check p
      Compile {path = p, module_name = m, backend = b, out = o} -> compile p m (show b) o
      Examples -> examples
  