2013-06-30 6 views
7

मैं एक लाइब्रेरी की तलाश में हूं जो कमांड लाइन तर्क पार्सिंग और सहायता पीढ़ी के झगड़े पर सार के लिए एक मोनैड का उपयोग करता है। मैं निम्न बातों का ध्यान काफी स्पष्ट उपयोग पैटर्न:मोनैड लाइब्रेरी पढ़ने के लिए कमांड लाइन तर्क

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 
    ... 

ऊपर कोड सभी जानकारी पार्स, सत्यापन और उपयोग पीढ़ी संभालने के लिए आवश्यक है और IMO समझने के लिए काफी आसान है। दुर्भाग्य से हैकेज के माध्यम से देखने और cmdargs, cmdlib, parseargs, ReadArgs जैसे पैकेजों की जांच करने के बाद मुझे इसके करीब कहीं भी कुछ नहीं मिला है। लेकिन कार्यान्वयन में डाइविंग से पहले मैं यह सुनिश्चित करना चाहता हूं कि मुझे कुछ भी याद नहीं आया है। तो क्या ऐसी कोई पुस्तकालय है जो समस्या के समान दृष्टिकोण का शोषण करती है?

+8

आप की कोशिश की है 'optparse-applicative'? 'Optparse-applicative' के लिए –

+4

+1। यह बहुत अच्छा है। – jtobin

+1

ऐसा लगता है कि पैरामीटर स्वचालित सहायता संदेशों को उत्पन्न करना लगभग असंभव होगा, यदि पैरामीटर अन्य पैरामीटर के मानों पर निर्भर करता है। शायद यही कारण है कि _optparse-applicative_ लागूकर्ता का उपयोग करता है। –

उत्तर

8

आप optparse-applicative का उपयोग कर सकते हैं। सबसे आम उपयोग पैटर्न इस तरह दिखता है (मैं तो बस कॉपी और चिपकाने कर रहा हूँ एक छोटे उपयोगिता मैं उपयोग से):

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]" ] 
    ... 

जब मैं -h साथ संकलित कार्यक्रम चलाने के लिए, मैं:

$ 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] 

इससे आपको कुछ निफ्टी विकल्पों का कुछ विचार मिलता है जिन्हें आप खेल सकते हैं और कार्यक्रम के अच्छे आउटपुट के साथ।

2

तो किसी को भी सवाल optparse-applicative का उपयोग कर में प्रस्तुत समस्या को हल करने में रुचि है, यहाँ मैं कैसे हासिल की है कि है:

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 
संबंधित मुद्दे