ImmutableKind<T>.jsonSerializable constructor

ImmutableKind<T>.jsonSerializable({
  1. String? name,
  2. String? jsonName,
  3. Map<String, Kind>? kinds,
  4. T walk(
    1. Mapper f,
    2. T t
    )?,
  5. required T fromJson(
    1. Map<String, dynamic> json
    ),
  6. Map<String, dynamic> toJson(
    1. T object
    )?,
  7. Map<String, T>? constantsByName,
})

Creates a kind for any JSON-serializable class.

This is convenient if you already have fromJson factory and don't want to invest time in writing a mapper.

Example

import 'package:kind/kind.dart';

final exampleKind = ImmutableKind<Example>.jsonSerializable(
  fromJson: Example.fromJson,
);

class Example {
  factory Example.fromJson(Map<String,dynamic> json) {
    // ...
  }

  Map<String,dynamic> toJson() {
    // ...
  }
}

Implementation

factory ImmutableKind.jsonSerializable({
  String? name,
  String? jsonName,
  Map<String, Kind>? kinds,
  T Function(Mapper f, T t)? walk,
  required T Function(Map<String, dynamic> json) fromJson,
  Map<String, dynamic> Function(T object)? toJson,
  Map<String, T>? constantsByName,
}) {
  Map<String, Object?> defaultToJson(T object) {
    return (object as dynamic).toJson();
  }

  T defaultWalk(Mapper f, T t) {
    final json = defaultToJson(t);
    json.forEach((key, value) {
      final kind = kinds?[key];
      if (kind == null) {
        f(value, key);
      } else {
        final decodedValue = kind.decodeJsonTree(value);
        f(decodedValue, key, kind: kind);
      }
    });
    return t;
  }

  toJson ??= defaultToJson;
  walk ??= defaultWalk;

  return ImmutableKind<T>.withConstructor(
    name: name,
    jsonName: jsonName,
    constructor: () => fromJson({}),
    walk: walk,
    fromJson: fromJson,
    toJson: toJson,
  );
}