Ignore:
Timestamp:
Oct 22, 2007, 2:55:19 AM (14 years ago)
Author:
Peter
Message:

adding possibility to make option required

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/yat/utility/OptionArg.h

    r975 r980  
    2626
    2727#include "Option.h"
     28#include "CommandLine.h"
    2829
    2930#include <stdexcept>
     
    5657       "h,help" for having both short and long option name
    5758       \param desc string used in help display
     59       \param required If true option must be found in commandline or
     60       exception is thrown in validation
    5861    */
    59     OptionArg(CommandLine& cmd, std::string name, std::string desc)
    60       : Option(cmd, name, desc) {}
     62    OptionArg(CommandLine& cmd, std::string name, std::string desc,
     63              bool required=false)
     64      : Option(cmd, name, desc), required_(required) {}
    6165
    6266    /**
     
    6569    T value(void) const { return value_; }
    6670
     71  protected:
     72    inline bool required(void) const { return required_; }
     73
    6774  private:
    68     T def_;
     75    bool required_;
    6976    T value_;
    7077
     
    7380    {
    7481      if ( first->size()>2 && (*first)[0]=='-' && (*first)[1]!='-'){
    75         std::string str("option requires an argument -- ");
    76         str += short_name();
    77         throw std::runtime_error(str);
     82        std::stringstream ss;
     83        ss << "option requires an argument -- " << short_name() << "\n"
     84           << cmd().try_help();
     85        throw std::runtime_error(ss.str());
    7886      }
    7987      if (first+1==last ) {
    8088        if (first->size()>2){
    8189          std::stringstream ss;
    82           ss << "option `--" << long_name() << "' requires an argument";
     90          ss << "option `--" << long_name() << "' requires an argument\n"
     91             << cmd().try_help();
    8392          throw std::runtime_error(ss.str());
    8493        }
    8594        else {
    86           std::string str("option requires an argument -- ");
    87           str += short_name();
    88           throw std::runtime_error(str);
     95          std::stringstream ss;
     96          ss << "option requires an argument -- " << short_name() << "\n"
     97             << cmd().try_help();
     98          throw std::runtime_error(ss.str());
    8999        }
    90100      }       
     
    117127    /**
    118128     */
    119     virtual void do_validate(void) const {}
     129    void do_validate(void) const
     130    {
     131      if (required_ && !present()) {
     132        std::stringstream ss;
     133        ss << "mandatory opition `";
     134        if (long_name().size())
     135          ss << long_name();
     136        else
     137          ss << short_name();
     138        ss << "' not given\n";
     139        ss << cmd().try_help();
     140        throw std::runtime_error(ss.str());
     141      }
     142      do_validate2();
     143    }
    120144
     145
     146    virtual void do_validate2(void) const {}
    121147  };
    122148
Note: See TracChangeset for help on using the changeset viewer.