poly_registry 2.0.0
poly_registry: ^2.0.0 copied to clipboard
Type-safe polymorphic registry and map converter for Dart. No code generation.
example/poly_registry_example.dart
// ignore_for_file: avoid_print
import 'package:poly_registry/poly_registry.dart';
// 1. Define your models
abstract class JobPayload {
Map<String, dynamic> toMap();
}
const typeKey = 'type';
class VideoPayload extends JobPayload {
VideoPayload({required this.filePath});
factory VideoPayload.fromMap(Map<String, dynamic> from) => VideoPayload(filePath: from['filePath'] as String);
final String filePath;
static const type = 'video';
@override
Map<String, dynamic> toMap() => {typeKey: type, 'filePath': filePath};
}
class DataSyncPayload extends JobPayload {
DataSyncPayload({required this.endpoint});
factory DataSyncPayload.fromMap(Map<String, dynamic> from) => DataSyncPayload(endpoint: from['endpoint'] as String);
final String endpoint;
static const type = 'dataSync';
@override
Map<String, dynamic> toMap() => {typeKey: type, 'endpoint': endpoint};
}
void main() {
// 2. Create the registry and convert
final registry = MapConverterRegistry<JobPayload>.prepare(
typeKey: typeKey,
entries: [
InlineMapConverter(VideoPayload.type, VideoPayload.fromMap),
InlineMapConverter(DataSyncPayload.type, DataSyncPayload.fromMap),
],
);
// 3. Use it.
final videoPayload = registry.convert({
typeKey: 'video',
'filePath': '/tmp/video.mp4',
});
print(videoPayload); // Instance of 'VideoPayload'
final dataSyncPayload = registry.convert({
typeKey: 'dataSync',
'endpoint': '/sync',
});
print(dataSyncPayload); // Instance of 'DataSyncPayload'
final List<JobPayload> payloadList = [
VideoPayload(filePath: '/tmp/video.mp4'),
DataSyncPayload(endpoint: '/sync'),
];
final List<Map<String, dynamic>> mapList = payloadList.map((e) => e.toMap()).toList();
final restoredList = registry.convertAll(mapList);
print(restoredList.length); // 2
}