Skip to content

Commit 3db794f

Browse files
committed
Fixed simple processor
1 parent fc6bcac commit 3db794f

File tree

4 files changed

+125
-29
lines changed

4 files changed

+125
-29
lines changed

.vscode/settings.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"files.associations": {
3+
"cctype": "cpp",
4+
"clocale": "cpp",
5+
"cmath": "cpp",
6+
"cstdarg": "cpp",
7+
"cstddef": "cpp",
8+
"cstdio": "cpp",
9+
"cstdlib": "cpp",
10+
"ctime": "cpp",
11+
"cwchar": "cpp",
12+
"cwctype": "cpp",
13+
"array": "cpp",
14+
"atomic": "cpp",
15+
"*.tcc": "cpp",
16+
"chrono": "cpp",
17+
"condition_variable": "cpp",
18+
"cstdint": "cpp",
19+
"deque": "cpp",
20+
"unordered_map": "cpp",
21+
"vector": "cpp",
22+
"exception": "cpp",
23+
"algorithm": "cpp",
24+
"functional": "cpp",
25+
"iterator": "cpp",
26+
"map": "cpp",
27+
"memory": "cpp",
28+
"memory_resource": "cpp",
29+
"numeric": "cpp",
30+
"optional": "cpp",
31+
"random": "cpp",
32+
"ratio": "cpp",
33+
"string": "cpp",
34+
"string_view": "cpp",
35+
"system_error": "cpp",
36+
"tuple": "cpp",
37+
"type_traits": "cpp",
38+
"utility": "cpp",
39+
"fstream": "cpp",
40+
"initializer_list": "cpp",
41+
"iosfwd": "cpp",
42+
"iostream": "cpp",
43+
"istream": "cpp",
44+
"limits": "cpp",
45+
"mutex": "cpp",
46+
"new": "cpp",
47+
"ostream": "cpp",
48+
"sstream": "cpp",
49+
"stdexcept": "cpp",
50+
"streambuf": "cpp",
51+
"thread": "cpp",
52+
"typeinfo": "cpp"
53+
}
54+
}

src/wsjcpp_arguments.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
// ---------------------------------------------------------------------
55

6-
WSJCppArgumentProcessor::WSJCppArgumentProcessor(const std::string &sName) {
7-
m_sName = sName;
8-
// m_sProgramName = sProgramName;
6+
WSJCppArgumentProcessor::WSJCppArgumentProcessor() {
7+
//
98
}
109

1110
// ---------------------------------------------------------------------
1211

1312
int WSJCppArgumentProcessor::handle(const std::string &sProgramName, const std::vector<std::string> &vSubParams) {
13+
1414
return -1;
1515
}
1616

@@ -22,12 +22,19 @@ bool WSJCppArgumentProcessor::canHandle(const std::vector<std::string> &vSubPara
2222

2323
// ---------------------------------------------------------------------
2424

25+
void WSJCppArgumentProcessor::addProcessor(WSJCppArgumentProcessor *p) {
26+
m_vProcessors.push_back(p);
27+
}
28+
29+
// ---------------------------------------------------------------------
30+
2531
WSJCppArguments::WSJCppArguments(int argc, const char* argv[]) {
2632
TAG = "WSJCppArguments";
2733
for (int i = 0; i < argc; i++) {
2834
m_vArguments.push_back(std::string(argv[i]));
2935
}
3036
m_sProgramName = m_vArguments[0];
37+
m_vArguments.erase(m_vArguments.begin());
3138
}
3239

3340
// ---------------------------------------------------------------------
@@ -39,23 +46,37 @@ void WSJCppArguments::addProcessor(WSJCppArgumentProcessor *p) {
3946
// ---------------------------------------------------------------------
4047

4148
int WSJCppArguments::handle() {
42-
return 0;
49+
WSJCppArgumentProcessor *pArgumentProcessor = this->findProcessor();
50+
if (pArgumentProcessor != nullptr) {
51+
return pArgumentProcessor->handle(m_sProgramName, m_vArguments);
52+
}
53+
WSJCppLog::err(TAG, "Not found argument processor");
54+
return -1;
55+
4356
}
4457

4558
// ---------------------------------------------------------------------
4659

4760
bool WSJCppArguments::canHandle() {
61+
WSJCppArgumentProcessor *pArgumentProcessor = this->findProcessor();
62+
return pArgumentProcessor != nullptr;
63+
}
64+
65+
// ---------------------------------------------------------------------
66+
67+
WSJCppArgumentProcessor *WSJCppArguments::findProcessor() {
68+
WSJCppArgumentProcessor *pRet = nullptr;
4869
bool bCanHandle = false;
4970
for (int i = 0; i < m_vProcessors.size(); i++) {
50-
if (!bCanHandle) {
51-
if (m_vProcessors[i]->canHandle(m_vArguments)) { // TODO pop
52-
bCanHandle = true;
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");
5376
}
54-
} else {
55-
WSJCppLog::err(TAG, "Several processors can handle this arguments");
5677
}
5778
}
58-
return false;
79+
return pRet;
5980
}
6081

6182
// ---------------------------------------------------------------------

src/wsjcpp_arguments.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,12 @@
88

99
class WSJCppArgumentProcessor {
1010
public:
11-
WSJCppArgumentProcessor(const std::string &sName);
11+
WSJCppArgumentProcessor();
1212
virtual int handle(const std::string &sProgramName, const std::vector<std::string> &vSubParams);
1313
virtual bool canHandle(const std::vector<std::string> &vSubParams);
14-
15-
void singleFlag(const std::string &sName);
16-
void param(const std::string &sName);
17-
void addSubArgumentProcesor(const std::string &sName, WSJCppArgumentProcessor *);
14+
void addProcessor(WSJCppArgumentProcessor *p);
1815
private:
19-
std::string m_sName;
20-
std::string m_sProgramName;
21-
std::vector<WSJCppArgumentProcessor *> m_vSubProcessors;
16+
std::vector<WSJCppArgumentProcessor *> m_vProcessors;
2217
};
2318

2419
// ---------------------------------------------------------------------
@@ -29,10 +24,10 @@ class WSJCppArguments {
2924
void addProcessor(WSJCppArgumentProcessor *p);
3025
int handle();
3126
bool canHandle();
32-
3327
std::string help();
3428

3529
private:
30+
WSJCppArgumentProcessor *findProcessor();
3631
std::string TAG;
3732
std::vector<std::string> m_vArguments;
3833
std::string m_sProgramName;

unit-tests/src/unit_test_simple_arguments.cpp

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,39 @@ void UnitTestSimpleArguments::init() {
2121

2222
class ArgumentProcessorInstall : public WSJCppArgumentProcessor {
2323
public:
24-
ArgumentProcessorInstall() : WSJCppArgumentProcessor("install") {
24+
ArgumentProcessorInstall() {
2525
TAG = "ArgumentProcessorInstall";
2626
};
2727

28-
int handle(const std::string &sProgramName, const std::vector<std::string> &vSubParams) {
29-
return -1;
28+
virtual int handle(const std::string &sProgramName, const std::vector<std::string> &vSubParams) {
29+
if (vSubParams.size() != 3) {
30+
WSJCppLog::err(TAG, "Expected 3 args");
31+
return -1;
32+
}
33+
34+
if (sProgramName != "./program") {
35+
WSJCppLog::err(TAG, "sProgramName expected as './program'");
36+
return -1;
37+
}
38+
39+
if (vSubParams[0] != "install") {
40+
WSJCppLog::err(TAG, "vSubParams[0] expected as 'install'");
41+
return -1;
42+
}
43+
44+
if (vSubParams[1] != "1") {
45+
WSJCppLog::err(TAG, "vSubParams[1] expected as '1'");
46+
return -1;
47+
}
48+
49+
if (vSubParams[2] != "2") {
50+
WSJCppLog::err(TAG, "vSubParams[2] expected as '2'");
51+
return -1;
52+
}
53+
return 0;
3054
}
3155

32-
bool canHandle(const std::vector<std::string> &vSubParams) {
56+
virtual bool canHandle(const std::vector<std::string> &vSubParams) {
3357
if (vSubParams.size() > 0 && vSubParams[0] == "install") {
3458
return true;
3559
}
@@ -47,16 +71,18 @@ bool UnitTestSimpleArguments::run() {
4771

4872
const int argc1 = 4;
4973
const char *argv1[argc1] = {"./program", "install", "1", "2"};
50-
WSJCppArguments args1(argc1, argv1);
74+
WSJCppArguments args1(argc1, argv1);
75+
args1.addProcessor(new ArgumentProcessorInstall());
76+
5177
compareB(bTestSuccess, "canHandle-1", args1.canHandle(), true);
5278
compareN(bTestSuccess, "handle-1", args1.handle(), 0);
5379

5480
const int argc2 = 4;
55-
const char *argv2[argc2] = {"./program", "some", "1", "2"};
56-
WSJCppArguments args2(argc2, argv2);
57-
compareB(bTestSuccess, "canHandle-1", args2.canHandle(), false);
58-
compareN(bTestSuccess, "handle-1", args2.handle(), -1);
81+
const char *argv2[argc2] = {"./program2", "some", "1", "2"};
82+
WSJCppArguments args2(argc2, argv2);
83+
compareB(bTestSuccess, "canHandle-2", args2.canHandle(), false);
84+
compareN(bTestSuccess, "handle-2", args2.handle(), -1);
5985

6086

61-
return true;
87+
return bTestSuccess;
6288
}

0 commit comments

Comments
 (0)