From 1fee1130aafc3fab890f3125a14ecbe38a44321a Mon Sep 17 00:00:00 2001 From: Kiril Tijsma Date: Thu, 19 Feb 2026 11:24:41 +0100 Subject: [PATCH 1/2] feat: add generic serializer model --- lib/src/serialization/serialization.dart | 1 + lib/src/serialization/serializer.dart | 100 +++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 lib/src/serialization/serializer.dart diff --git a/lib/src/serialization/serialization.dart b/lib/src/serialization/serialization.dart index 08a61cc..2a970f5 100644 --- a/lib/src/serialization/serialization.dart +++ b/lib/src/serialization/serialization.dart @@ -2,3 +2,4 @@ export "cast_from_map.dart"; export "datetime_from_map.dart"; export "double_from_map.dart"; export "map_data.dart"; +export "serializer.dart"; diff --git a/lib/src/serialization/serializer.dart b/lib/src/serialization/serializer.dart new file mode 100644 index 0000000..c82c2b6 --- /dev/null +++ b/lib/src/serialization/serializer.dart @@ -0,0 +1,100 @@ +import "package:dart_iconica_utilities/src/select_map/select_map.dart"; +import "package:dart_iconica_utilities/src/value_validator/value_validator.dart"; + +/// +class Serializer { + /// + Serializer({ + required this.fromMap, + required this.toMap, + this.validators = const {}, + this.fieldPaths = const [], + this.data, + }); + + /// + factory Serializer.readOnly({ + required Map Function(T object) toMap, + required Map validators, + List fieldPaths = const [], + Map? data, + }) => + Serializer( + fromMap: (_) => throw SerializerReadOnlyException(), + toMap: toMap, + validators: validators, + fieldPaths: fieldPaths, + data: data, + ); + + /// + factory Serializer.writeOnly({ + required T Function(Map map) fromMap, + required Map validators, + List fieldPaths = const [], + Map? data, + }) => + Serializer( + fromMap: fromMap, + toMap: (_) => throw SerializerWriteOnlyException(), + validators: validators, + fieldPaths: fieldPaths, + data: data, + ); + + /// + final Map validators; + + /// + final T Function(Map map) fromMap; + + /// + final Map Function(T object) toMap; + + /// + final Map? data; + + /// + final List fieldPaths; + + /// + bool validate({ + bool raiseException = false, + }) { + try { + validators.validate(data ?? {}); + return true; + } on ValidationException { + if (raiseException) rethrow; + return false; + } + } + + /// + Serializer withData(Map data) => Serializer( + toMap: toMap, + fromMap: fromMap, + validators: validators, + data: data, + fieldPaths: fieldPaths, + ); + + /// + Serializer withObject(T object) => withData(toMap(object)); + + /// + Map serialize() { + var data = this.data ?? {}; + if (fieldPaths.isEmpty) { + return data; + } + + return data.select(fieldPaths); + } +} + +/// +class SerializerWriteOnlyException implements Exception {} + +/// +class SerializerReadOnlyException implements Exception {} From 6345aadf564bd1d2f471c78e715489ee59c4e727 Mon Sep 17 00:00:00 2001 From: Kiril Tijsma Date: Thu, 19 Feb 2026 11:22:06 +0100 Subject: [PATCH 2/2] chore: increment version to 0.0.3 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66c2d7b..4441d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.3 + +- Add generic Serializer model + ## 0.0.2 - Add select and omit methods for Map diff --git a/pubspec.yaml b/pubspec.yaml index 87b4865..8970d57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: dart_iconica_utilities description: Useful utilities for dart projects -version: 0.0.2 +version: 0.0.3 homepage: https://iconica.app