2015-05-13 6 views
6

E 'facile per specificare le opzioni si escludono a vicenda con optparse-applicative:Come si fornisce un messaggio di errore specifico con optparse-applicative quando vengono fornite più opzioni mutuamente esclusive?

data Exclusive = E1 | E2 

exclusiveParser :: Parser ExclusiveOption 
exclusiveParser = 
     (flag' E1 (short 'e1') 
    <|> (flag' E2 (short 'e2') 

È possibile che questo parser analizzerà sia -e1 o -e2, ma non entrambi. L'azione optparse-applicativa predefinita quando vengono forniti sia sia -e2 è per stampare il messaggio di utilizzo dell'applicazione. Vorrei fornire all'utente un messaggio di errore specifico che li informa che non è possibile fornire siae -e2, ma non vedo un modo ovvio per farlo.

Qualche suggerimento (o soluzione) sarebbe apprezzato?

risposta

2

Non ho familiarità con optparse-applicative, quindi non sono sicuro di quali siano le funzionalità di stampa degli errori fornite. (A volte le librerie di combinatori di parser offrono una primitiva che modifica l'errore che è stato stampato, ma non ho visto nulla per quello su una rapida scrematura dei documenti optparse-applicativi.Tutto possibile che mi sia sfuggito.)

Ma nel caso nulla è disponibile dalla libreria stessa, puoi sempre stampare il tuo messaggio accettando entrambe le bandiere; per esempio.

data Exclusive = E1 | E2 | Both 
exclusiveParser 
    = (flag' E1 (short 'e')) 
    <|> (flag' E2 (short 'f')) 
    <|> (flag' Both (short 'e') <* flag' Both (short 'f')) 

Poi, nel tuo gestore di livello superiore (vale a dire una volta che le opzioni sono tutti analizzati), se si vede Both, è possibile emettere un messaggio di errore della propria lavorazione in quel momento.

Problemi correlati