methods method

  1. @override
Map<String, Function> methods()
override

Implementation

@override
Map<String, Function> methods() {
  return {
    'stringify': (dynamic value, [dynamic replacer, dynamic space]) {
      dynamic replacerFn;
      if (replacer is Function) {
        replacerFn = replacer;
      }

      int? indent;
      if (space is num) indent = space.toInt();
      if (space is String) indent = space.length;

      dynamic applyReplacer(String key, dynamic val) {
        if (replacerFn != null) {
          return replacerFn([key, val]);
        }
        return val;
      }

      dynamic walk(dynamic key, dynamic val) {
        val = applyReplacer(key.toString(), val);
        if (val is Map) {
          Map<String, dynamic> m = {};
          val.forEach((k, v) {
            m[k.toString()] = walk(k.toString(), v);
          });
          return m;
        } else if (val is List) {
          return val
              .asMap()
              .entries
              .map((e) => walk(e.key.toString(), e.value))
              .toList();
        }
        return val;
      }

      final processed = walk('', value);
      if (indent != null && indent > 0) {
        return const JsonEncoder.withIndent('  ').convert(processed);
      }
      return jsonEncode(processed);
    },
    'parse': (String value, [dynamic reviver]) {
      dynamic parsed = json.decode(value);
      if (reviver is! Function) return parsed;

      dynamic walk(dynamic key, dynamic val) {
        if (val is Map) {
          final Map<String, dynamic> m = {};
          val.forEach((k, v) {
            m[k] = walk(k, v);
          });
          return reviver([key, m]);
        } else if (val is List) {
          final list = val
              .asMap()
              .entries
              .map((e) => walk(e.key.toString(), e.value))
              .toList();
          return reviver([key, list]);
        } else {
          return reviver([key, val]);
        }
      }

      return walk('', parsed);
    }
  };
}