2013-06-30 21 views
7

Ayrıştırma ve yardım üretme komut satırı tartışmalarının yaygarası üzerinde soyutlamak için bir monad kullanan bir kitaplık arıyorum. Aklımda şu oldukça açık kullanım deseni vardır:Komut satırı argümanları monad kütüphanesini okuma

main = do 
    portOrSocket <- Args.run $ do 
    mbSocket <- Args.read $ Args.Arg "s" "socket" "Description" 
    mbPort <- Args.read $ Args.Arg "p" "port" "Description" 
    case mbSocket of 
     Just socket -> return $ Right socket 
     Nothing -> case mbPort of 
     Just port -> return $ Left port 
     Nothing -> return $ Left defaultPort 
    ... 

Yukarıdaki kod ayrıştırma, doğrulama ve kullanım nesil işlemek için gerekli tüm bilgiler ve IMO anlamak oldukça kolaydır. Ne yazık ki, hackage ve cmdargs, cmdlib, parseargs, ReadArgs gibi paketleri kontrol ettikten sonra bir şey bulamadık. Ama uygulamaya geçmeden önce hiçbir şeyi kaçırmadığımdan emin olmak isterim. Yani, soruna benzer bir yaklaşımdan yararlanan bir kütüphane var mı?

+8

Eğer 'optparse-applicative' denediniz mi? Optparse-applicative için –

+4

+1. Bu harika. – jtobin

+1

Diğer parametrelerin değerlerine bağlı olarak parametreler otomatik yardım mesajları oluşturmak neredeyse imkansız gibi görünüyor. Bu muhtemelen _optparse-applicative_ uygulamasının Uygulamayı kullandığıdır. –

cevap

8

optparse-applicative'u kullanabilirsiniz. En yaygın kullanım deseni (Ben sadece kopyalayıp yapıştırma kullandığım küçük bir şebekeden ediyorum) şöyle görünür:

options :: Parser (String, String) 
options = (,) 
    <$> (strOption $ mconcat [ 
     short 'n', 
     long "node", 
     metavar "NODE", 
     value "127.0.0.1", 
     showDefaultWith id, 
     completer (bashCompleter "hostname"), 
     help "AMQP node to connect to" ]) 
    <*> (strOption $ mconcat [ 
     short 'q', 
     long "queue", 
     metavar "QUEUE", 
     value "1.0.0", 
     showDefaultWith id, 
     help "Queue to initialize" ]) 

main = do 
    (hostName, queue) <- 
     execParser $ info (helper <*> options) $ mconcat [ 
      fullDesc, 
      header "The Suns setup utility", 
      progDesc "Sets up an AMQP node", 
      footer "Report bugs to [email protected]" ] 
    ... 

Ben -h ile derlenmiş program çalıştırdığınızda, alıyorum:

$ suns-admin -h 
The Suns setup utility 

Usage: suns-admin [-n|--node NODE] [-q|--queue QUEUE] 
    Sets up an AMQP node 

Available options: 
    -h,--help    Show this help text 
    -n,--node NODE   AMQP node to connect to (default: 127.0.0.1) 
    -q,--queue QUEUE   Queue to initialize (default: 1.0.0) 

Report bugs to [email protected] 

Bu, oynayabileceğiniz bazı şık seçenekler ve programın ürettiği güzel çıktı hakkında biraz fikir verir.

2

herkes burada, optparse-applicative kullanarak söz sunulan sorununun çözümünde ilgileniyor Bunu elde buysa:

import Options.Applicative 

getOptions :: Int -> IO (Either Int String) 
getOptions defaultPort = 
    execParser $ 
    info (helper <*> parser defaultPort) $ 
    fullDesc <> 
    progDesc "Run a content-db server on a socket or a port" <> 
    header "Run a content-db server" 

parser :: Int -> Parser (Either Int String) 
parser defaultPort = 
    portOrSocket <$> 
    (optional . strOption) 
     (short 's' <> 
     long "socket" <> 
     help "Socket") 
    <*> 
    option 
     (short 'p' <> 
     long "port" <> 
     help "Port" <> 
     value defaultPort) 
    where 
    portOrSocket (Just socket) _ = Right socket 
    portOrSocket _ port = Left port 

main = do 
    getOptions 43400 >>= \o -> case o of 
    Left port -> print port 
    Right socket -> print socket 
İlgili konular