traverse method

String traverse(
  1. Map? obj,
  2. String key, [
  3. bool keepAlive = false
])

Get the value of the key from a complex obj.

Supports multi-level traversing. That's where the InterpolationOption.subKeyPointer comes into place.

If keepAlive is set to true, it'll leave all placeholders intact if the value is not found inside obj. Or else, it'll be substituted with '' (empty String)

Example:

var interpolation = Interpolation();
var obj = {
  'a': 'a',
  'b': 10,
  'c': {
    'd': 'd',
    'e': 'Hello {c.d}',
    'f': 'Hi "{a}", am I deep enough, or need to show "{c.e}" with {b}'
  }
};
print(interpolation.traverse(obj, 'b'));
// output: 10
print(interpolation.traverse(obj, 'c.e'));
// output: Hello {c.d}
print(interpolation.traverse(obj, 'c.g')); // not present
// output: (empty string)
print(interpolation.traverse(obj, 'c.g', true)); // not present but keepAlive
// output: {c.g}

Implementation

String traverse(Map? obj, String key, [bool keepAlive = false]) {
  var result = key.split(_option._subKeyPointer).fold(
      obj,
      (parent, k) => null == parent
          ? null
          : parent is String
              ? parent
              : (parent as dynamic)[k]);
  return result?.toString() ?? (keepAlive ? _missingKeyKeepAlive(key) : '');
}