11
11
//! that requires a [GcContext].
12
12
use std:: marker:: PhantomData ;
13
13
14
- use serde:: de:: { Deserializer , DeserializeSeed } ;
14
+ use crate :: array:: { GcArray , GcString } ;
15
+ use serde:: de:: { self , Deserializer , DeserializeSeed } ;
15
16
16
17
use crate :: prelude:: * ;
17
18
@@ -35,6 +36,36 @@ impl<'gc, 'de, Id: CollectorId, T: GcDeserialize<'gc, 'de, Id>> GcDeserialize<'g
35
36
}
36
37
}
37
38
39
+
40
+ impl < ' gc , ' de , Id : CollectorId , T : GcDeserialize < ' gc , ' de , Id > > GcDeserialize < ' gc , ' de , Id > for GcArray < ' gc , T , Id >
41
+ where <Id :: System as GcSystem >:: Context : GcSimpleAlloc {
42
+ fn deserialize_gc < D : Deserializer < ' de > > ( ctx : & ' gc <Id :: System as GcSystem >:: Context , deserializer : D ) -> Result < Self , D :: Error > {
43
+ Ok ( ctx. alloc_array_from_vec (
44
+ Vec :: < T > :: deserialize_gc ( ctx, deserializer) ?
45
+ ) )
46
+ }
47
+ }
48
+
49
+
50
+ impl < ' gc , ' de , Id : CollectorId > GcDeserialize < ' gc , ' de , Id > for GcString < ' gc , Id >
51
+ where <Id :: System as GcSystem >:: Context : GcSimpleAlloc {
52
+ fn deserialize_gc < D : Deserializer < ' de > > ( ctx : & ' gc <Id :: System as GcSystem >:: Context , deserializer : D ) -> Result < Self , D :: Error > {
53
+ struct GcStrVisitor < ' gc , A : GcSimpleAlloc > {
54
+ ctx : & ' gc A
55
+ }
56
+ impl < ' de , ' gc , A : GcSimpleAlloc > de:: Visitor < ' de > for GcStrVisitor < ' gc , A > {
57
+ type Value = GcString < ' gc , A :: Id > ;
58
+ fn expecting ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
59
+ f. write_str ( "a string" )
60
+ }
61
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E > where E : de:: Error , {
62
+ Ok ( self . ctx . alloc_str ( v) )
63
+ }
64
+ }
65
+ deserializer. deserialize_str ( GcStrVisitor { ctx } )
66
+ }
67
+ }
68
+
38
69
/// Implement [GcDeserialize] for a type by delegating to its [serde::Deserialize] implementation.
39
70
///
40
71
/// This should only be used for types that can never have gc pointers inside of them (or if you don't care to support that).
0 commit comments