// Common/CommandLineParser.h

#ifndef __COMMON_COMMAND_LINE_PARSER_H
#define __COMMON_COMMAND_LINE_PARSER_H

#include "MyString.h"

namespace NCommandLineParser {

bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2);
void SplitCommandLine(const UString &s, UStringVector &parts);

namespace NSwitchType
{
  enum EEnum
  {
    kSimple,
    kMinus,
    kString,
    kChar
  };
}

struct CSwitchForm
{
  const char *Key;
  Byte Type;
  bool Multi;
  Byte MinLen;
  // int MaxLen;
  const char *PostCharSet;
};

struct CSwitchResult
{
  bool ThereIs;
  bool WithMinus;
  int PostCharIndex;
  UStringVector PostStrings;
  
  CSwitchResult(): ThereIs(false) {};
};
  
class CParser
{
  unsigned _numSwitches;
  CSwitchResult *_switches;

  bool ParseString(const UString &s, const CSwitchForm *switchForms);
public:
  UStringVector NonSwitchStrings;
  AString ErrorMessage;
  UString ErrorLine;
  
  CParser(unsigned numSwitches);
  ~CParser();
  bool ParseStrings(const CSwitchForm *switchForms, const UStringVector &commandStrings);
  const CSwitchResult& operator[](size_t index) const { return _switches[index]; }
};

}

#endif
