Gabriella439 / optparse-generic

Auto-generate a command-line parser for your datatype
BSD 3-Clause "New" or "Revised" License
208 stars 32 forks source link

Sum type parsing #50

Open MaxGabriel opened 6 years ago

MaxGabriel commented 6 years ago

Hi, I wanted to use a sum type in my command line parsing, and I came up with this:

data FrontendLanguage = Typescript | Swift deriving (Eq, Show, Read, Generic)

instance ParseField FrontendLanguage
instance ParseRecord FrontendLanguage
instance ParseFields FrontendLanguage

data Tasks
    = GenerateRoutes 
      { language :: FrontendLanguage <?> "Options are: Typescript, Swift"
      , frontendRepo :: FilePath <?> "Path to the root of the frontend repo"
      }
    deriving (Generic, Show)

instance ParseRecord Tasks

It works fine in the success case, though there isn't a specific error message if you provide an invalid sum type, just the generic help text.

Is this the best way to do this? I couldn't find anything in the documentation about this (could have missed it, though). If it is the best way, I'll submit a PR to document this use-case in the Haddocks if you'd like.

Gabriella439 commented 6 years ago

Yeah, that's about the best you can do within this library. You can do better if you use the underlying optparse-applicative library to define the ParseFields instance for FrontendLanguage because then you can define it to be something like ( --typescript | --swift )