1
+ //! Traits for converting from Ruby [`Value`]s to Rust types.
2
+
1
3
use std:: path:: PathBuf ;
2
4
3
5
use rb_sys:: { rb_get_path, rb_num2dbl} ;
@@ -20,20 +22,16 @@ pub trait TryConvert: Sized {
20
22
fn try_convert ( val : Value ) -> Result < Self , Error > ;
21
23
}
22
24
23
- /// Only implemented on Rust types. TryConvert may convert from a
24
- /// Value to another Ruby type. Use this when you need a Rust value that's
25
- /// divorced from the Ruby runtime, safe to put on the heap, etc.
26
- pub trait TryConvertOwned : TryConvert {
27
- /// Convert `val` into `Self`.
28
- fn try_convert_owned ( val : Value ) -> Result < Self , Error > {
29
- Self :: try_convert ( val)
30
- }
31
- }
32
-
33
- pub trait TryConvertForArg : Sized {
34
- /// Convert `val` into `Self`.
35
- fn try_convert_for_arg ( val : Value ) -> Result < Self , Error > ;
36
- }
25
+ /// Conversions from [`Value`] to Rust types that do not contain [`Value`].
26
+ ///
27
+ /// This trait is used as a bound on some implementations of [`TryConvert`]
28
+ /// (for example, for [`Vec`]) to prevent heap allocated datastructures
29
+ /// containing `Value`, as it is not safe to store a `Value` on the heap.
30
+ ///
31
+ /// # Safety
32
+ ///
33
+ /// This trait must not be implemented for types that contain `Value`.
34
+ pub unsafe trait TryConvertOwned : TryConvert { }
37
35
38
36
impl < T > TryConvert for Option < T >
39
37
where
@@ -44,100 +42,91 @@ where
44
42
}
45
43
}
46
44
47
- impl < T > TryConvertOwned for Option < T >
48
- where
49
- T : TryConvertOwned ,
50
- {
51
- fn try_convert_owned ( val : Value ) -> Result < Self , Error > {
52
- ( !val. is_nil ( ) )
53
- . then ( || T :: try_convert_owned ( val) )
54
- . transpose ( )
55
- }
56
- }
45
+ unsafe impl < T > TryConvertOwned for Option < T > where T : TryConvertOwned { }
57
46
58
47
impl TryConvert for bool {
59
48
fn try_convert ( val : Value ) -> Result < Self , Error > {
60
49
Ok ( val. to_bool ( ) )
61
50
}
62
51
}
63
- impl TryConvertOwned for bool { }
52
+ unsafe impl TryConvertOwned for bool { }
64
53
65
54
impl TryConvert for i8 {
66
55
fn try_convert ( val : Value ) -> Result < Self , Error > {
67
56
Integer :: try_convert ( val) ?. to_i8 ( )
68
57
}
69
58
}
70
- impl TryConvertOwned for i8 { }
59
+ unsafe impl TryConvertOwned for i8 { }
71
60
72
61
impl TryConvert for i16 {
73
62
fn try_convert ( val : Value ) -> Result < Self , Error > {
74
63
Integer :: try_convert ( val) ?. to_i16 ( )
75
64
}
76
65
}
77
- impl TryConvertOwned for i16 { }
66
+ unsafe impl TryConvertOwned for i16 { }
78
67
79
68
impl TryConvert for i32 {
80
69
fn try_convert ( val : Value ) -> Result < Self , Error > {
81
70
Integer :: try_convert ( val) ?. to_i32 ( )
82
71
}
83
72
}
84
- impl TryConvertOwned for i32 { }
73
+ unsafe impl TryConvertOwned for i32 { }
85
74
86
75
impl TryConvert for i64 {
87
76
fn try_convert ( val : Value ) -> Result < Self , Error > {
88
77
Integer :: try_convert ( val) ?. to_i64 ( )
89
78
}
90
79
}
91
- impl TryConvertOwned for i64 { }
80
+ unsafe impl TryConvertOwned for i64 { }
92
81
93
82
impl TryConvert for isize {
94
83
fn try_convert ( val : Value ) -> Result < Self , Error > {
95
84
Integer :: try_convert ( val) ?. to_isize ( )
96
85
}
97
86
}
98
- impl TryConvertOwned for isize { }
87
+ unsafe impl TryConvertOwned for isize { }
99
88
100
89
impl TryConvert for u8 {
101
90
fn try_convert ( val : Value ) -> Result < Self , Error > {
102
91
Integer :: try_convert ( val) ?. to_u8 ( )
103
92
}
104
93
}
105
- impl TryConvertOwned for u8 { }
94
+ unsafe impl TryConvertOwned for u8 { }
106
95
107
96
impl TryConvert for u16 {
108
97
fn try_convert ( val : Value ) -> Result < Self , Error > {
109
98
Integer :: try_convert ( val) ?. to_u16 ( )
110
99
}
111
100
}
112
- impl TryConvertOwned for u16 { }
101
+ unsafe impl TryConvertOwned for u16 { }
113
102
114
103
impl TryConvert for u32 {
115
104
fn try_convert ( val : Value ) -> Result < Self , Error > {
116
105
Integer :: try_convert ( val) ?. to_u32 ( )
117
106
}
118
107
}
119
- impl TryConvertOwned for u32 { }
108
+ unsafe impl TryConvertOwned for u32 { }
120
109
121
110
impl TryConvert for u64 {
122
111
fn try_convert ( val : Value ) -> Result < Self , Error > {
123
112
Integer :: try_convert ( val) ?. to_u64 ( )
124
113
}
125
114
}
126
- impl TryConvertOwned for u64 { }
115
+ unsafe impl TryConvertOwned for u64 { }
127
116
128
117
impl TryConvert for usize {
129
118
fn try_convert ( val : Value ) -> Result < Self , Error > {
130
119
Integer :: try_convert ( val) ?. to_usize ( )
131
120
}
132
121
}
133
- impl TryConvertOwned for usize { }
122
+ unsafe impl TryConvertOwned for usize { }
134
123
135
124
impl TryConvert for f32 {
136
125
fn try_convert ( val : Value ) -> Result < Self , Error > {
137
126
f64:: try_convert ( val) . map ( |f| f as f32 )
138
127
}
139
128
}
140
- impl TryConvertOwned for f32 { }
129
+ unsafe impl TryConvertOwned for f32 { }
141
130
142
131
impl TryConvert for f64 {
143
132
fn try_convert ( val : Value ) -> Result < Self , Error > {
@@ -157,15 +146,15 @@ impl TryConvert for f64 {
157
146
Ok ( res)
158
147
}
159
148
}
160
- impl TryConvertOwned for f64 { }
149
+ unsafe impl TryConvertOwned for f64 { }
161
150
162
151
impl TryConvert for String {
163
152
fn try_convert ( val : Value ) -> Result < Self , Error > {
164
153
debug_assert_value ! ( val) ;
165
154
RString :: try_convert ( val) ?. to_string ( )
166
155
}
167
156
}
168
- impl TryConvertOwned for String { }
157
+ unsafe impl TryConvertOwned for String { }
169
158
170
159
#[ cfg( feature = "bytes-crate" ) ]
171
160
impl TryConvert for bytes:: Bytes {
@@ -176,15 +165,15 @@ impl TryConvert for bytes::Bytes {
176
165
}
177
166
178
167
#[ cfg( feature = "bytes-crate" ) ]
179
- impl TryConvertOwned for bytes:: Bytes { }
168
+ unsafe impl TryConvertOwned for bytes:: Bytes { }
180
169
181
170
impl TryConvert for char {
182
171
fn try_convert ( val : Value ) -> Result < Self , Error > {
183
172
debug_assert_value ! ( val) ;
184
173
RString :: try_convert ( val) ?. to_char ( )
185
174
}
186
175
}
187
- impl TryConvertOwned for char { }
176
+ unsafe impl TryConvertOwned for char { }
188
177
189
178
impl < T > TryConvert for Vec < T >
190
179
where
@@ -195,7 +184,7 @@ where
195
184
RArray :: try_convert ( val) ?. to_vec ( )
196
185
}
197
186
}
198
- impl < T > TryConvertOwned for Vec < T > where T : TryConvertOwned { }
187
+ unsafe impl < T > TryConvertOwned for Vec < T > where T : TryConvertOwned { }
199
188
200
189
impl < T , const N : usize > TryConvert for [ T ; N ]
201
190
where
@@ -206,7 +195,7 @@ where
206
195
RArray :: try_convert ( val) ?. to_array ( )
207
196
}
208
197
}
209
- impl < T , const N : usize > TryConvertOwned for [ T ; N ] where T : TryConvert { }
198
+ unsafe impl < T , const N : usize > TryConvertOwned for [ T ; N ] where T : TryConvert { }
210
199
211
200
impl < T0 > TryConvert for ( T0 , )
212
201
where
@@ -225,7 +214,7 @@ where
225
214
Ok ( ( slice[ 0 ] . try_convert ( ) ?, ) )
226
215
}
227
216
}
228
- impl < T0 > TryConvertOwned for ( T0 , ) where T0 : TryConvert { }
217
+ unsafe impl < T0 > TryConvertOwned for ( T0 , ) where T0 : TryConvert { }
229
218
230
219
impl < T0 , T1 > TryConvert for ( T0 , T1 )
231
220
where
@@ -245,7 +234,7 @@ where
245
234
Ok ( ( slice[ 0 ] . try_convert ( ) ?, slice[ 1 ] . try_convert ( ) ?) )
246
235
}
247
236
}
248
- impl < T0 , T1 > TryConvertOwned for ( T0 , T1 )
237
+ unsafe impl < T0 , T1 > TryConvertOwned for ( T0 , T1 )
249
238
where
250
239
T0 : TryConvert ,
251
240
T1 : TryConvert ,
@@ -275,7 +264,7 @@ where
275
264
) )
276
265
}
277
266
}
278
- impl < T0 , T1 , T2 > TryConvertOwned for ( T0 , T1 , T2 )
267
+ unsafe impl < T0 , T1 , T2 > TryConvertOwned for ( T0 , T1 , T2 )
279
268
where
280
269
T0 : TryConvert ,
281
270
T1 : TryConvert ,
@@ -308,7 +297,7 @@ where
308
297
) )
309
298
}
310
299
}
311
- impl < T0 , T1 , T2 , T3 > TryConvertOwned for ( T0 , T1 , T2 , T3 )
300
+ unsafe impl < T0 , T1 , T2 , T3 > TryConvertOwned for ( T0 , T1 , T2 , T3 )
312
301
where
313
302
T0 : TryConvert ,
314
303
T1 : TryConvert ,
@@ -344,7 +333,7 @@ where
344
333
) )
345
334
}
346
335
}
347
- impl < T0 , T1 , T2 , T3 , T4 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 )
336
+ unsafe impl < T0 , T1 , T2 , T3 , T4 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 )
348
337
where
349
338
T0 : TryConvert ,
350
339
T1 : TryConvert ,
@@ -383,7 +372,7 @@ where
383
372
) )
384
373
}
385
374
}
386
- impl < T0 , T1 , T2 , T3 , T4 , T5 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 )
375
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 )
387
376
where
388
377
T0 : TryConvert ,
389
378
T1 : TryConvert ,
@@ -425,7 +414,7 @@ where
425
414
) )
426
415
}
427
416
}
428
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 )
417
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 )
429
418
where
430
419
T0 : TryConvert ,
431
420
T1 : TryConvert ,
@@ -470,7 +459,7 @@ where
470
459
) )
471
460
}
472
461
}
473
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 )
462
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 )
474
463
where
475
464
T0 : TryConvert ,
476
465
T1 : TryConvert ,
@@ -518,7 +507,8 @@ where
518
507
) )
519
508
}
520
509
}
521
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > TryConvertOwned for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 )
510
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > TryConvertOwned
511
+ for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 )
522
512
where
523
513
T0 : TryConvert ,
524
514
T1 : TryConvert ,
@@ -569,7 +559,7 @@ where
569
559
) )
570
560
}
571
561
}
572
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > TryConvertOwned
562
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > TryConvertOwned
573
563
for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 )
574
564
where
575
565
T0 : TryConvert ,
@@ -625,7 +615,7 @@ where
625
615
) )
626
616
}
627
617
}
628
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > TryConvertOwned
618
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > TryConvertOwned
629
619
for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 )
630
620
where
631
621
T0 : TryConvert ,
@@ -684,7 +674,7 @@ where
684
674
) )
685
675
}
686
676
}
687
- impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > TryConvertOwned
677
+ unsafe impl < T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > TryConvertOwned
688
678
for ( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 )
689
679
where
690
680
T0 : TryConvert ,
@@ -712,7 +702,7 @@ where
712
702
RHash :: try_convert ( val) ?. to_hash_map ( )
713
703
}
714
704
}
715
- impl < K , V > TryConvertOwned for std:: collections:: HashMap < K , V >
705
+ unsafe impl < K , V > TryConvertOwned for std:: collections:: HashMap < K , V >
716
706
where
717
707
K : TryConvertOwned + Eq + std:: hash:: Hash ,
718
708
V : TryConvertOwned ,
@@ -742,4 +732,4 @@ impl TryConvert for PathBuf {
742
732
}
743
733
}
744
734
745
- impl TryConvertOwned for PathBuf { }
735
+ unsafe impl TryConvertOwned for PathBuf { }
0 commit comments