Skip to content

Commit

Permalink
feat(katana): Add isJsonEncodable.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Sep 30, 2022
1 parent 1cf1782 commit 55030f5
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 4 deletions.
9 changes: 9 additions & 0 deletions packages/katana/lib/extension/list_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,13 @@ extension ListExtensions<T> on List<T> {
}
return tmp;
}

/// If this object is Json encodable, `true` is returned.
/// このオブジェクトがJsonでエンコード可能な場合`true`が返されます。
///
/// If a [List] or [Map] exists, its contents are also checked.
/// [List][Map]が存在していた場合はその中身までチェックされます。
bool get isJsonEncodable {
return every((element) => element.isJsonEncodable);
}
}
12 changes: 12 additions & 0 deletions packages/katana/lib/extension/map_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,18 @@ extension MapExtensions<K, V> on Map<K, V> {
return values.every((element) => containsValue(element));
}

/// If this object is Json encodable, `true` is returned.
/// このオブジェクトがJsonでエンコード可能な場合`true`が返されます。
///
/// If a [List] or [Map] exists, its contents are also checked.
/// [List][Map]が存在していた場合はその中身までチェックされます。
bool get isJsonEncodable {
if (K != String) {
return false;
}
return values.every((element) => element.isJsonEncodable);
}

/// Returns `true` if the internals of [Map] and [others] are compared and match.
/// [Map][others]の内部を比較して一致している場合`true`を返します。
bool equalsTo(Map<K, V> others) {
Expand Down
15 changes: 15 additions & 0 deletions packages/katana/lib/extension/nullable_object_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,19 @@ extension NullableObjectExtensions on Object? {
}
return this as T;
}

/// If this object is Json encodable, `true` is returned.
/// このオブジェクトがJsonでエンコード可能な場合`true`が返されます。
///
/// If a [List] or [Map] exists, its contents are also checked.
/// [List][Map]が存在していた場合はその中身までチェックされます。
bool get isJsonEncodable {
final o = this;
if (o is List<dynamic>) {
return o.isJsonEncodable;
} else if (o is Map<String, dynamic>) {
return o.isJsonEncodable;
}
return o is num || o is bool || o is String;
}
}
8 changes: 4 additions & 4 deletions packages/katana/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ packages:
name: _fe_analyzer_shared
url: "https://pub.dartlang.org"
source: hosted
version: "48.0.0"
version: "49.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.0"
version: "5.1.0"
args:
dependency: transitive
description:
Expand Down Expand Up @@ -70,7 +70,7 @@ packages:
name: coverage
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
version: "1.6.1"
crypto:
dependency: "direct main"
description:
Expand Down Expand Up @@ -224,7 +224,7 @@ packages:
name: recase
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
version: "4.1.0"
shelf:
dependency: transitive
description:
Expand Down
44 changes: 44 additions & 0 deletions packages/katana/test/nullable_object_extensions_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,48 @@ void main() {
expect(nullVal.def(10), 10);
expect(text.def(10), 10);
});
test("NullableObjectExtensions.jsonEncodable", () {
// ignore: unnecessary_nullable_for_final_variable_declarations
const num? val = 100;
// ignore: unnecessary_nullable_for_final_variable_declarations
const String? text = "100";
const test = _Test();
const num? nullVal = null;
final map = <String, dynamic>{
"aaa": 1,
"bbb": 2,
"ccc": 3,
};
final testObjInMap = <String, dynamic>{
"aaa": 1,
"bbb": 2,
"ccc": const _Test(),
};
final list = <dynamic>[
"1",
2,
0.0,
];
final testObjInList = <dynamic>[
"3",
3,
const _Test(),
];
final set = <dynamic>{};
final intMap = <int, dynamic>{};
expect(val.isJsonEncodable, true);
expect(nullVal.isJsonEncodable, false);
expect(text.isJsonEncodable, true);
expect(test.isJsonEncodable, false);
expect(map.isJsonEncodable, true);
expect(testObjInMap.isJsonEncodable, false);
expect(list.isJsonEncodable, true);
expect(testObjInList.isJsonEncodable, false);
expect(set.isJsonEncodable, false);
expect(intMap.isJsonEncodable, false);
});
}

class _Test {
const _Test();
}

0 comments on commit 55030f5

Please sign in to comment.