Skip to content

Commit 4de9291

Browse files
committed
feat: properly enable dynamic serialization again for plain serialization calls
Dogs will now automatically treat from/to calls with a dynamic type argument and no specified type or tree property as polymorphic inputs and then use the polymorphic converter. Refs: #24
1 parent 126d010 commit 4de9291

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

packages/dogs_core/lib/src/extensions.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ extension DogEngineShortcuts on DogEngine {
126126
final converter = getTreeConverter(tree);
127127
result =
128128
modeRegistry.nativeSerialization.forConverter(converter, this).serialize(value, this);
129+
} else if (T == dynamic && type == null) {
130+
final converter = findConverter(PolymorphicConverter)!;
131+
result =
132+
modeRegistry.nativeSerialization.forConverter(converter, this).serialize(value, this);
129133
} else {
130134
result = convertIterableToNative(value, type ?? T, kind);
131135
}
@@ -152,7 +156,13 @@ extension DogEngineShortcuts on DogEngine {
152156
return modeRegistry.nativeSerialization
153157
.forConverter(converter, this)
154158
.deserialize(value, this);
159+
} else if (T == dynamic && type == null) {
160+
final converter = findConverter(PolymorphicConverter)!;
161+
return modeRegistry.nativeSerialization
162+
.forConverter(converter, this)
163+
.deserialize(value, this);
155164
}
165+
156166
return convertIterableFromNative(value, type ?? T, kind);
157167
}
158168

smoke/test0/lib/parts/dynamic.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
part of "../test.dart";
2+
3+
void testDynamic() {
4+
testDynamicSerialization("Simple Model", ModelA.variant0());
5+
testDynamicSerialization("Simple List", [ModelA.variant0(), ModelB.variant1()]);
6+
testDynamicSerialization("Simpel Map", {
7+
"a": ModelA.variant0(),
8+
"b": ModelB.variant1(),
9+
});
10+
testDynamicSerialization("Null", null);
11+
testDynamicSerialization("String", "hello");
12+
testDynamicSerialization("Int", 42);
13+
testDynamicSerialization("Double", 3.14);
14+
testDynamicSerialization("Bool", true);
15+
testDynamicSerialization("Primitive List", [1, 2, 3, 4, 5]);
16+
testDynamicSerialization("Primitive Map", {
17+
"a": 1,
18+
"b": 2,
19+
"c": 3,
20+
});
21+
}
22+
23+
void testDynamicSerialization(String name, dynamic input) {
24+
test(name, () {
25+
final encoded = dogs.toNative(input);
26+
final decoded = dogs.fromNative(encoded);
27+
final reencoded = dogs.toNative(decoded);
28+
expect(reencoded, deepEquals(encoded));
29+
expect(input.toString(), decoded.toString());
30+
});
31+
}

smoke/test0/lib/test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'conformities.dart';
1616
import 'models.dart';
1717

1818
part "parts/conformities.dart";
19+
part 'parts/dynamic.dart';
1920
part "parts/encodings.dart";
2021
part "parts/models.dart";
2122
part "parts/operations.dart";
@@ -35,6 +36,7 @@ Future main() async {
3536
test("Validators", testValidators);
3637
test("Trees", testTrees);
3738
test("Projection", testProjection);
39+
group("Dynamic", testDynamic);
3840

3941
group("Encodings", () {
4042
test("Json", () {

0 commit comments

Comments
 (0)