  Copyright 2020 United States Government as represented by the Administrator
  of the National Aeronautics and Space Administration . All Rights Reserved .
--
-- Disclaimers
--
  No Warranty : THE SUBJECT SOFTWARE IS PROVIDED " AS IS " WITHOUT ANY WARRANTY
  OF ANY KIND , EITHER EXPRESSED , IMPLIED , OR STATUTORY , INCLUDING , BUT NOT
  LIMITED TO , ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
  PROVIDED , WILL CONFORM TO THE SUBJECT SOFTWARE . THIS AGREEMENT DOES NOT , IN
-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
  RECIPIENT OF ANY RESULTS , RESULTING DESIGNS , HARDWARE , SOFTWARE PRODUCTS OR
  ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE .  ,
-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
  THIRD - PARTY SOFTWARE , IF PRESENT IN THE ORIGINAL SOFTWARE , AND DISTRIBUTES
-- IT "AS IS."
--
-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
  THE UNITED STATES GOVERNMENT , ITS CONTRACTORS AND SUBCONTRACTORS , AS WELL AS
-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
  ANY LIABILITIES , DEMANDS , DAMAGES , EXPENSES OR LOSSES ARISING FROM SUCH USE ,
-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
  UNITED STATES GOVERNMENT , ITS CONTRACTORS AND SUBCONTRACTORS , AS WELL AS ANY
  PRIOR RECIPIENT , TO THE EXTENT PERMITTED BY LAW . RECIPIENT 'S  
  FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE , UNILATERAL TERMINATION OF THIS
-- AGREEMENT.
--
  | CLI interface to the CStructs2Copilot subcommand
module CLI.CommandCStructs2Copilot
    (
      -- * Direct command access
      command
    , CommandOpts
    , ErrorCode

      -- * CLI
    , commandDesc
    , commandOptsParser
    )
  where

-- External imports
import Options.Applicative ( Parser, help, long, metavar, strOption )

-- External imports: command results
import Command.Result ( Result )

-- External imports: actions or commands supported
import Command.CStructs2Copilot ( ErrorCode, cstructs2Copilot )

-- * Command

-- | A Copilot correspondence for a C struct can be generated by providing
-- the path to the file that declares the struct.
newtype CommandOpts = CommandOpts
  { cstructsFileName :: FilePath }

-- | Generate Copilot struct definitions and instances from structs defined in
-- a C header file.
--
-- This is just an uncurried version of "Command.CStructs2Copilot".
command :: CommandOpts -> IO (Result ErrorCode)
command c = cstructs2Copilot (cstructsFileName c)

-- * CLI

-- | Command description for CLI help.
commandDesc :: String
commandDesc = "Generate Copilot structs from C structs"

-- | Subparser for the @structs@ command, used to generate Copilot declarations
-- from C structs.
commandOptsParser :: Parser CommandOpts
commandOptsParser = CommandOpts
  <$> strOption
        (  long "header-file-name"
        <> metavar "FILENAME"
        <> help strStructsHeaderArgDesc
        )

-- | Argument C header file to struct conversion command
strStructsHeaderArgDesc :: String
strStructsHeaderArgDesc = "C header file with struct definitions"


 Disclaimers

 SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
 SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
 ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
 GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
 IT "AS IS."

 Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
 ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
 INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
 USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
 AGREEMENT.

 * Direct command access
 * CLI
 External imports
 External imports: command results
 External imports: actions or commands supported
 * Command
 | A Copilot correspondence for a C struct can be generated by providing
 the path to the file that declares the struct.
 | Generate Copilot struct definitions and instances from structs defined in
 a C header file.

 This is just an uncurried version of "Command.CStructs2Copilot".
 * CLI
 | Command description for CLI help.
 | Subparser for the @structs@ command, used to generate Copilot declarations
 from C structs.
 | Argument C header file to struct conversion command
  Copyright 2020 United States Government as represented by the Administrator
  of the National Aeronautics and Space Administration . All Rights Reserved .
  No Warranty : THE SUBJECT SOFTWARE IS PROVIDED " AS IS " WITHOUT ANY WARRANTY
  OF ANY KIND , EITHER EXPRESSED , IMPLIED , OR STATUTORY , INCLUDING , BUT NOT
  LIMITED TO , ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
  PROVIDED , WILL CONFORM TO THE SUBJECT SOFTWARE . THIS AGREEMENT DOES NOT , IN
  RECIPIENT OF ANY RESULTS , RESULTING DESIGNS , HARDWARE , SOFTWARE PRODUCTS OR
  ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE .  ,
  THIRD - PARTY SOFTWARE , IF PRESENT IN THE ORIGINAL SOFTWARE , AND DISTRIBUTES
  THE UNITED STATES GOVERNMENT , ITS CONTRACTORS AND SUBCONTRACTORS , AS WELL AS
  ANY LIABILITIES , DEMANDS , DAMAGES , EXPENSES OR LOSSES ARISING FROM SUCH USE ,
  UNITED STATES GOVERNMENT , ITS CONTRACTORS AND SUBCONTRACTORS , AS WELL AS ANY
  PRIOR RECIPIENT , TO THE EXTENT PERMITTED BY LAW . RECIPIENT 'S  
  FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE , UNILATERAL TERMINATION OF THIS
  | CLI interface to the CStructs2Copilot subcommand
module CLI.CommandCStructs2Copilot
    (
      command
    , CommandOpts
    , ErrorCode

    , commandDesc
    , commandOptsParser
    )
  where

import Options.Applicative ( Parser, help, long, metavar, strOption )

import Command.Result ( Result )

import Command.CStructs2Copilot ( ErrorCode, cstructs2Copilot )


newtype CommandOpts = CommandOpts
  { cstructsFileName :: FilePath }

command :: CommandOpts -> IO (Result ErrorCode)
command c = cstructs2Copilot (cstructsFileName c)


commandDesc :: String
commandDesc = "Generate Copilot structs from C structs"

commandOptsParser :: Parser CommandOpts
commandOptsParser = CommandOpts
  <$> strOption
        (  long "header-file-name"
        <> metavar "FILENAME"
        <> help strStructsHeaderArgDesc
        )

strStructsHeaderArgDesc :: String
strStructsHeaderArgDesc = "C header file with struct definitions"
