aboutsummaryrefslogblamecommitdiffstats
path: root/meowpp/Usage.h
blob: 801b11cf7bbae049659b32b0882e0aa050456611 (plain) (tree)
1
2
3
4



                   



















































                                                                



































                                                                    
     




























































                                                                                                          
     



                    
                   
#ifndef   Usage_H__
#define   Usage_H__

#include <cstdlib>

#include <string>
#include <vector>
#include <map>

namespace meow{
  class Usage{
    private:
      typedef std::string         String;
      typedef std::vector<String> Strings;
      class Value{
        public:
          Value();
          Value(String const& v);
          Value(String const& v, String const& d);
          String getUsage() const;
          String getValue() const;
          bool operator==(Value const& b) const;
        private:
          String value;
          String description;
      };
      typedef std::vector<Value> Values;
      class Option{
        public:
          Option();
          Option(String const& des);
          Option(String const& des, 
                 String const& typ,
                 String const& def,
                 bool must);
          bool   setValue(String const& str);
          String getValue(size_t index) const;
          size_t getValuesCount() const;
          bool   addValueAccept(String const& val, 
                                String const& des);
          bool   hasSetup() const;
          bool   hasValue() const;
          bool   chkSetup() const;
          String getUsage(unsigned char opt, bool detail) const;
        private:
          Strings values;
          Values  values_accept;
          String  value_default;
          String  value_type;
          String  description;
          bool  has_value;
          bool  has_setup;
          bool must_setup;
      };
      typedef std::map<unsigned char, Option> Options;
      typedef Options::const_iterator OptionsIterator;
    public:
      Usage();
      Usage(String const& _name);
      ////////// **# Add other options #** ///////////
      bool import(Usage const& usage);
      bool update(Usage const& usage);
      /////////// **# add a option/value #** /////////
      bool addOption(unsigned char opt, String const& des);
      bool addOption(unsigned char opt, String const& des,
                     String const& val_type,
                     String const& val_default,
                     bool must);
      bool addOptionValueAccept(unsigned char opt,
                                String const& val,
                                String const& des);
      ///////// **# access informations #** //////////
      bool    hasOptionSetup(unsigned char opt              ) const;
      size_t  getOptionValuesCount(unsigned char opt        ) const;
      String  getOptionValue(unsigned char opt, size_t index) const;
      size_t  getProcArgsCount() const;
      String  getProcArg(size_t index) const;
      Strings getProcArgs() const;
      //////// **# add a usage description #** ///////
      void    addUsageBegin(String const& des);
      void    addUsageEnd  (String const& des);
      ///////////// **# access usages #** ////////////
      String  getUsage() const;
      ////////// **# analysis argc,argv #** //////////
      bool    setArguments(int argc, char** argv, String* errmsg);
    private:
      String  name;
      Options options;
      Strings usage_begin;
      Strings usage_end  ;
      Strings proc_arguments;
  };
  //#
  //# === meow:: *Usage* (C++ Class)
  //# ==== Description
  //#   `Usage` 是用來分析argc, argv和輸出usage document的class.
  //#   argc, argv的部份, 有以下規則
  //#
  //# * `-c` 其中 `c` 可以代換成正常的一個字元的字符,
  //#     這種選像要嘛就是 *有設置* , 不然就是 *沒設置*
  //# * `-c <value>` 附加一個value, 這種選項可以是選擇性 ,即要設定與否都可以,
  //#     反之則一定要設定. 另外可以給定value的預設值以及哪些value是可接受的
  //# * `<value>` 其他, 一律視為process arguments
  //#
  //# ==== Methods
  //#   * `Usage(String const& _name)` +
  //#      建構子, 所有說明文字中 *<name>* 都會被代換成 `_name`
  //#   * `Usage()` +
  //#      建構子, `_name` 自動取為 " *nobody* "
  //#   * `import(Usage const& usage)` +
  //#      將另一個usage的設定匯入, 回傳成功與否 *(bool)*
  //#   * `update(Usage const& usage)` +
  //#      將另一個usage分析argc,argv出來的資料拿來用, 回傳成功與否 *(bool)* 
  //#   * `addOption(unsigned char option, String const& description)` +
  //#      新增一個不接額外選項的參數, 並附上說明文字, 回傳成功與否 *(bool)* 
  //#   * `addOption(unsigned char option, String const& description,
  //#      String const& value_type, String const& value_default, bool must)` +
  //#      新增一個有額外選項的參數, 並附上說明文字, 額外選項的型別跟預設值.
  //#      說明文字中所有的" *<types>* "將會被取代指定的型別, 其中 `must` 代表
  //#      " *是否一定要設定此參數* " , 回傳表成功與否 *(bool)*
  //#   * `addOptionValueAccept(unsigned char option,
  //#      String const& value, String const& description)` +
  //#      針對某個option, 新增一個可接受的額外選項 (如果某個option從頭到尾都
  //#      沒有新增可接受的選項, 則視為不限制), 回傳成功與否 *(bool)*
  //#   * `hasOptionSetup(unsigned char option)` +
  //#      回傳是否有此選項 *(bool)*
  //#   * `getOptionValuesCount(unsigned char option)` +
  //#      回傳此參數被設置了幾次 *(size_t)* , 只對有接額外參數的有效
  //#   * `getOptionValue(unsigned char option, size_t index)` +
  //#      回傳第`index`個額外選項 *(String)*
  //#   * `getProcArgsCount()` +
  //#      回傳有多少個Process Arguments *(size_t)*
  //#   * `getProcArg(size_t index)` +
  //#      取得第`index`個Process Argument *(String)*
  //#   * `getProcArgs()` +
  //#      回傳一個陣列, 包含所有Process Arguments *(Strings)*
  //#   * `addUsageBegin(String const& des)` +
  //#      新增一段usage document於每個選項逐條說明之前
  //#   * `addUsageEnd  (String const& des)`  +
  //#      新增一段usage document於每個選項逐條說明之後
  //#   * `String  getUsage()` +
  //#      回傳usage document *(String)*
  //#   * `setArguments(int argc, char** argv, String* errmsg)` +
  //#      輸入argv, argc, 回傳是否沒有錯誤發生 *(bool)* , 其中如果有錯誤發生, 
  //#      且 `errmsg != NULL` 則會將錯誤訊息寫入之
  //#
  //#[NOTE]
  //#==================================
  //# * `String` 是 `std::string` . 
  //# * `Strings` 是 `std::vector< std::string> >`. 
  //# * 如果沒有寫回傳什麼, 就是回傳 `void`
  //#==================================
  //#
  //#'''
  //#
}

#include "Usage.hpp"

#endif // Usage_H__