parse method

B parse(
  1. Map<String, MethodSpec> methods,
  2. String expression
)

Implementation

B parse(Map<String, MethodSpec> methods, String expression) {
  final tokens = expression.trim().split(RegExp(r'\s+'));

  for (int i = 0; i < tokens.length;) {
    final name = tokens[i];
    final args = <dynamic>[];
    i++;

    final spec = methods[name];
    if (spec == null) throw ArgumentError('Unknown method: $name');

    for (int j = 0; j < spec.argCount && i < tokens.length; j++) {
      final type = spec.argTypes[j];
      try {
        args.add(type.parse(tokens[i]));
      }
      catch (e) {
        throw ArgumentError('Invalid argument for $name: ${tokens[i]} is not a valid ${type.name}');
      }

      i++;
    }

    if (args.length < spec.argCount) {
      throw ArgumentError('Missing arguments for $name: expected ${spec.argCount}, got ${args.length}');
    }

    spec.apply(this, args);
  }

  return this as B;
}