// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:gcloud/db.dart';
import 'package:json_annotation/json_annotation.dart';

import 'key_helper.dart';

/// A converter for [Key]s encoded as strings.
class StringKeyConverter implements JsonConverter<Key<String>?, String> {
  const StringKeyConverter();

  @override
  Key<String>? fromJson(String? json) =>
      (json == null || json.isEmpty) ? null : KeyHelper().decode(json) as Key<String>;

  @override
  String toJson(Key<String>? key) => key == null ? '' : KeyHelper().encode(key);
}

/// A converter for [Key]s encoded as strings.
class IntKeyConverter implements JsonConverter<Key<int>, String> {
  const IntKeyConverter();

  @override
  Key<int> fromJson(String json) => KeyHelper().decode(json) as Key<int>;

  @override
  String toJson(Key<int?> key) => KeyHelper().encode(key);
}
