2016-07-11 13 views
1

Ich benutze Options.Applicative Haskell Befehlszeile, mein Plattentyp für die Option zu handhaben ist wie:Wie Mustervergleich in Haskell options.applicative für Datensatztyp?

data Options = Options { xml :: String 
          ,eut :: String 
         } deriving (Show) 

options :: Parser Options 
options = Options 
       <$> strOption (short 'x' 
           <> long "xml" 
           <> metavar "XMLFILE" 
           <> value [] 
           <> help "GCCXML file for parsing") 
       <*> strOption (short 'e' 
           <> long "eut" 
           <> metavar "PATH_2_EUT" 
           <> value [] 
           <> help "EUT Json filepath for parsing") 

Da ist in meinem Haskell Haupt-Code, ich habe:

main :: IO() 
main = do 
    options <- execParser parseOpts 
    case options of 
    Options {xml = [], eut = []} -> putStrLn "use -h to print usage info" 
    -- xml option 
    Options {xml = _, eut = []} -> parseXML $ xml options 
    -- eut option 
    Options {xml = [], eut = _} -> genMeta $ eut options 
    -- no matching 
    _ -> putStrLn "use -h to print usage info" 
    where 
    parseOpts = info (helper <*> options) 
     (fullDesc 
     <> progDesc "Given GCCXML file, generate EUT json and test meta files" 
     <> header "map2meta - Generate test meta files") 

Meine Absicht ist, die Verarbeitung entweder zu tun für "-x" oder "-e". Ich erreiche dies, indem ich das Muster Options {xml = _, eut = []} benutze, um den Fall anzupassen, dass die Befehlszeile "-x", aber keine "-e" hat, während Options {xml = [], eut = _ } dem Fall entspricht, dass die Befehlszeile "-e", aber keine "-x" hat. Allerdings, wenn ich das Programm ohne Optionen ausführen, scheint es Options {xml = _ , eut = [] } erhalten übereinzustimmen. Also fügte ich hinzu, um diesen Fall abzufangen. Ich denke, dass der Platzhalter '_' tatsächlich verwendet werden kann, um ein '[]' zu finden, obwohl ich hoffte, dass es nur zu 'etwas' anstelle einer leeren Zeichenfolge passen würde. Daher lautet meine erste Frage, wie man ein Muster erstellt, das einer nicht leeren Zeichenfolge entspricht.

Meine zweite Frage ist, wie Code hinzufügen, um die Nutzungsinformationen auszudrucken? Im Moment drucke ich es nur, wenn ich "-h" benutze. Ich möchte es drucken, wenn keine Optionen in der Befehlszeile angegeben sind.

Antwort

1

Da String ist nur eine Art Synonym für [Char], können nicht leeren Saiten mit dem Muster übereinstimmen kann _:_, das heißt eine nicht-leere Liste mit einem Kopfelement _ (was auch immer) und einem Schwanz Liste _ (was auch immer).

So könnte man drei Fälle haben:

  • Options {xml = _:_, eut = []}: xml gesetzt ist, eut ungesetzt ist
  • Options {xml = [], eut = _:_}: eut gesetzt ist, ist xml ungesetzt
  • _: Die ganze Rest (entweder weder Satz oder beides sind)

Alternativ könnte man g o mit einem multi-way if:

Options{..} <- execParser ... 
if | not (null xml) && null eot -> ... 
    | not (null eot) && null xml -> ... 
    | otherwise -> error ...