1// Copyright 2017 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5export class BaseArgumentsProcessor {
6  constructor(args) {
7    this.args_ = args;
8    this.result_ = this.getDefaultResults();
9    console.assert(this.result_ !== undefined)
10    console.assert(this.result_.logFileName !== undefined);
11    this.argsDispatch_ = this.getArgsDispatch();
12    console.assert(this.argsDispatch_ !== undefined);
13  }
14
15  getDefaultResults() {
16    throw "Implement in getDefaultResults in subclass";
17  }
18
19  getArgsDispatch() {
20    throw "Implement getArgsDispatch in subclass";
21  }
22
23  result() { return this.result_ }
24
25  printUsageAndExit() {
26    print('Cmdline args: [options] [log-file-name]\n' +
27          'Default log file name is "' +
28          this.result_.logFileName + '".\n');
29    print('Options:');
30    for (const arg in this.argsDispatch_) {
31      const synonyms = [arg];
32      const dispatch = this.argsDispatch_[arg];
33      for (const synArg in this.argsDispatch_) {
34        if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) {
35          synonyms.push(synArg);
36          delete this.argsDispatch_[synArg];
37        }
38      }
39      print(`  ${synonyms.join(', ').padEnd(20)} ${dispatch[2]}`);
40    }
41    quit(2);
42  }
43
44  parse() {
45    while (this.args_.length) {
46      let arg = this.args_.shift();
47      if (arg.charAt(0) != '-') {
48        this.result_.logFileName = arg;
49        continue;
50      }
51      let userValue = null;
52      const eqPos = arg.indexOf('=');
53      if (eqPos != -1) {
54        userValue = arg.substr(eqPos + 1);
55        arg = arg.substr(0, eqPos);
56      }
57      if (arg in this.argsDispatch_) {
58        const dispatch = this.argsDispatch_[arg];
59        const property = dispatch[0];
60        const defaultValue = dispatch[1];
61        if (typeof defaultValue == "function") {
62          userValue = defaultValue(userValue);
63        } else if (userValue == null) {
64          userValue = defaultValue;
65        }
66        this.result_[property] = userValue;
67      } else {
68        return false;
69      }
70    }
71    return true;
72  }
73}
74
75export function parseBool(str) {
76  if (str == "true" || str == "1") return true;
77  return false;
78}
79