33
44// ---------------------------------------------------------------------
55
6- WSJCppArgumentProcessor::WSJCppArgumentProcessor () {
7- //
6+ WSJCppArgumentProcessor::WSJCppArgumentProcessor (const std::string &sName , const std::string &sDescription ) {
7+ TAG = " WSJCppArgumentProcessor-" + sName ;
8+ m_sName = sName ;
9+ m_sDescription = sDescription ;
10+ }
11+
12+ // ---------------------------------------------------------------------
13+
14+ std::string WSJCppArgumentProcessor::getName () {
15+ return m_sName;
16+ }
17+
18+ // ---------------------------------------------------------------------
19+
20+ std::string WSJCppArgumentProcessor::getDescription () {
21+ return m_sDescription;
822}
923
1024// ---------------------------------------------------------------------
@@ -22,68 +36,106 @@ bool WSJCppArgumentProcessor::canHandle(const std::vector<std::string> &vSubPara
2236
2337// ---------------------------------------------------------------------
2438
25- void WSJCppArgumentProcessor::addProcessor (WSJCppArgumentProcessor *p) {
39+ void WSJCppArgumentProcessor::registryProcessor (WSJCppArgumentProcessor *p) {
40+ for (int i = 0 ; i < m_vProcessors.size (); i++) {
41+ if (m_vProcessors[i]->getName () == p->getName ()) {
42+ WSJCppLog::throw_err (TAG, " Processor '" + p->getName () + " ' already registered" );
43+ }
44+ }
2645 m_vProcessors.push_back (p);
2746}
2847
2948// ---------------------------------------------------------------------
3049
50+ void WSJCppArgumentProcessor::registrySingleArgument (const std::string &sArgumentName , const std::string &sDescription ) {
51+
52+ }
53+
54+ // ---------------------------------------------------------------------
55+
56+ void WSJCppArgumentProcessor::registryParamArgument (const std::string &sArgumentName , const std::string &sDescription ) {
57+
58+ }
59+
60+ // ---------------------------------------------------------------------
61+
62+ std::string WSJCppArgumentProcessor::help (const std::string &sProgramName , const std::string &sPrefix ) {
63+ std::string sRet = " " ;
64+ if (sProgramName == m_sName) {
65+ sRet = " Usage: " + m_sName + " <params> <command> <subcomands/args>\r\n " ;
66+ }
67+ sRet += sPrefix + " <params>: \r\n " ;
68+ sRet += sPrefix + " [] - description \r\n " ; // TODO
69+
70+ if (m_vProcessors.size () > 0 ) {
71+ sRet += sPrefix + " <commands>: \r\n " ;
72+ for (int i = 0 ; i < m_vProcessors.size (); i++) {
73+ WSJCppArgumentProcessor *p = m_vProcessors[i];
74+ sRet += sPrefix + " " + p->getName () + " - " + p->getDescription () + " \r\n " ;
75+ sRet += p->help (sProgramName , sPrefix + " " );
76+ }
77+ }
78+ sRet += " \r\n " ; // TODO
79+ return sRet ;
80+ }
81+
82+ // ---------------------------------------------------------------------
83+
84+ WSJCppArgumentProcessor *WSJCppArgumentProcessor::findProcessor (const std::vector<std::string> &vSubParams) {
85+ WSJCppArgumentProcessor *pRet = nullptr ;
86+ bool bCanHandle = false ;
87+ for (int i = 0 ; i < m_vProcessors.size (); i++) {
88+ if (m_vProcessors[i]->canHandle (vSubParams)) {
89+ if (pRet == nullptr ) {
90+ pRet = m_vProcessors[i];
91+ } else {
92+ WSJCppLog::throw_err (TAG, " Several processors can handle this arguments" );
93+ }
94+ }
95+ }
96+ return pRet;
97+ }
98+
99+ // ---------------------------------------------------------------------
100+
31101WSJCppArguments::WSJCppArguments (int argc, const char * argv[]) {
32102 TAG = " WSJCppArguments" ;
33103 for (int i = 0 ; i < argc; i++) {
34104 m_vArguments.push_back (std::string (argv[i]));
35105 }
36106 m_sProgramName = m_vArguments[0 ];
37107 m_vArguments.erase (m_vArguments.begin ());
38- }
39-
40- // ---------------------------------------------------------------------
41-
42- void WSJCppArguments::addProcessor (WSJCppArgumentProcessor *p) {
43- m_vProcessors.push_back (p);
108+ m_pRoot = new WSJCppArgumentProcessor (m_sProgramName, " " );
44109}
45110
46111// ---------------------------------------------------------------------
47112
48113int WSJCppArguments::handle () {
49- WSJCppArgumentProcessor *pArgumentProcessor = this ->findProcessor ();
114+ WSJCppArgumentProcessor *pArgumentProcessor = m_pRoot ->findProcessor (m_vArguments );
50115 if (pArgumentProcessor != nullptr ) {
51116 return pArgumentProcessor->handle (m_sProgramName, m_vArguments);
52117 }
53118 WSJCppLog::err (TAG, " Not found argument processor" );
54119 return -1 ;
55-
56120}
57121
58122// ---------------------------------------------------------------------
59123
60124bool WSJCppArguments::canHandle () {
61- WSJCppArgumentProcessor *pArgumentProcessor = this ->findProcessor ();
125+ WSJCppArgumentProcessor *pArgumentProcessor = m_pRoot ->findProcessor (m_vArguments );
62126 return pArgumentProcessor != nullptr ;
63127}
64128
65129// ---------------------------------------------------------------------
66130
67- WSJCppArgumentProcessor *WSJCppArguments::findProcessor () {
68- WSJCppArgumentProcessor *pRet = nullptr ;
69- bool bCanHandle = false ;
70- for (int i = 0 ; i < m_vProcessors.size (); i++) {
71- if (m_vProcessors[i]->canHandle (m_vArguments)) {
72- if (pRet == nullptr ) {
73- pRet = m_vProcessors[i];
74- } else {
75- WSJCppLog::throw_err (TAG, " Several processors can handle this arguments" );
76- }
77- }
78- }
79- return pRet;
131+ WSJCppArgumentProcessor &WSJCppArguments::getRoot () {
132+ return *m_pRoot;
80133}
81134
82135// ---------------------------------------------------------------------
83136
84137std::string WSJCppArguments::help () {
85- // TODO
86- return " " ;
138+ return m_pRoot->help (m_sProgramName, " " );
87139}
88140
89141// ---------------------------------------------------------------------
0 commit comments