SmartArg constructor

SmartArg()

Implementation

SmartArg() {
  final instanceMirror = reflectable.reflect(this);

  // Find our app meta data (if any)
  _app =
      instanceMirror.type.metadata.firstWhere((m) => m is Parser) as Parser?;

  // Build an easy to use lookup for arguments on the command line
  // to their corresponding Parameter configurations.
  _values = {};
  _commands = {};
  _mirrorParameterPairs = [];

  {
    Group? currentGroup;

    for (final mirror in instanceMirror.type.declarations.values
        .where((p) => p is VariableMirror && _isFalse(p.isPrivate))) {
      currentGroup =
          mirror.metadata.firstWhereOrNull((m) => m is Group) as Group? ??
              currentGroup;

      final parameter =
          mirror.metadata.firstWhereOrNull((m) => m is Argument);
      if (parameter != null) {
        final mpp = MirrorParameterPair(
          mirror as VariableMirror,
          parameter as Argument,
          currentGroup,
        );
        for (final key in mpp.keys(_app)) {
          if (_values.containsKey(key)) {
            throw StateError('$key was configured multiple times');
          }
          _values[key] = mpp;
        }
        _mirrorParameterPairs.add(mpp);
        if (parameter is Command) {
          _commands[mpp.displayKey] = mpp;
        }
      }
    }
  }
}