proto3-suite-0.4.0.2: tools/compile-proto-file/Main.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
import Data.Semigroup ((<>))
import Options.Applicative
import Prelude hiding (FilePath)
import Proto3.Suite.DotProto.Generate
parseArgs :: ParserInfo CompileArgs
parseArgs = info (helper <*> parser) (fullDesc <> progDesc "Compiles a .proto file to a Haskell module")
where
parser = CompileArgs <$> includes <*> extraInstances <*> proto <*> out <*> useLegacyTypes
includes = many $ strOption $
long "includeDir"
<> metavar "DIR"
<> help "Path to search for included .proto files (can be repeated, and paths will be searched in order; the current directory is used if this option is not provided)"
extraInstances = many $ strOption $
long "extraInstanceFile"
<> metavar "FILE"
<> help "Additional file to provide instances that would otherwise be generated. Can be used multiple times. Types for which instance overrides are given must be fully qualified."
proto = strOption $
long "proto"
<> metavar "FILE"
<> help "Path to input .proto file"
out = strOption $
long "out"
<> metavar "DIR"
<> help "Output directory path where generated Haskell modules will be written (directory is created if it does not exist; note that files in the output directory may be overwritten!)"
boolToUseLegacyTypes = \bool -> case bool of
True -> YesLegacy
False -> NoLegacy
useLegacyTypes = boolToUseLegacyTypes <$> (switch $
long "use-legacy-types"
<> help "If this flag is set, the program will use legacy behavior to wrap protobuf Wrapper types (e.g. Int32Value) with Maybe in the generated Haskell code (provided for backwards compatibility).")
main :: IO ()
main = execParser parseArgs >>= compileDotProtoFileOrDie