Skip to content

Commit d40836e

Browse files
committed
Fix serde support for Dim migration
1 parent 5c1f829 commit d40836e

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

src/array_serde.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,36 @@
77
// except according to those terms.
88
use serde::{self, Serialize, Deserialize};
99

10+
use std::marker::PhantomData;
11+
1012
use imp_prelude::*;
1113

1214
use super::arraytraits::ARRAY_FORMAT_VERSION;
1315
use super::Elements;
16+
use Dim;
17+
use dimension::DimPrivate;
1418

15-
use std::marker::PhantomData;
19+
/// **Requires crate feature `"serde"`**
20+
impl<I> Serialize for Dim<I>
21+
where I: Serialize,
22+
{
23+
fn serialize<Se>(&self, serializer: &mut Se) -> Result<(), Se::Error>
24+
where Se: serde::Serializer
25+
{
26+
self.ix().serialize(serializer)
27+
}
28+
}
29+
30+
/// **Requires crate feature `"serde"`**
31+
impl<I> Deserialize for Dim<I>
32+
where I: Deserialize,
33+
{
34+
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
35+
where D: serde::de::Deserializer
36+
{
37+
I::deserialize(deserializer).map(Dim::new)
38+
}
39+
}
1640

1741
/// **Requires crate feature `"serde"`**
1842
impl<A, D, S> Serialize for ArrayBase<S, D>

tests/serialize.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#![cfg(any(feature = "rustc-serialize", feature = "serde"))]
22
#[cfg(feature = "rustc-serialize")]
33
extern crate rustc_serialize as serialize;
4-
extern crate ndarray;
4+
5+
#[macro_use] extern crate ndarray;
56

67
#[cfg(feature = "serde")]
78
extern crate serde;
@@ -12,7 +13,7 @@ extern crate serde_json;
1213
#[cfg(feature = "rustc-serialize")]
1314
use serialize::json;
1415

15-
use ndarray::{arr0, arr1, arr2, RcArray, Ix, S, Si};
16+
use ndarray::{arr0, arr1, arr2, RcArray, RcArray1, RcArray2};
1617

1718
#[cfg(feature = "rustc-serialize")]
1819
#[test]
@@ -44,15 +45,15 @@ fn serial_many_dim()
4445
println!("{:?}", res);
4546
assert_eq!(a, res.unwrap());
4647
let text = r##"{"v":1,"dim":[2,3],"data":[3,1,2.2,3.1,4,7]}"##;
47-
let b = json::decode::<RcArray<f32, (Ix, Ix)>>(text);
48+
let b = json::decode::<RcArray2<f32>>(text);
4849
assert_eq!(a, b.unwrap());
4950
}
5051

5152

5253
{
5354
// Test a sliced array.
5455
let mut a = RcArray::linspace(0., 31., 32).reshape((2, 2, 2, 4));
55-
a.islice(&[Si(0, None, -1), S, S, Si(0, Some(2), 1)]);
56+
a.islice(s![..;-1, .., .., ..2]);
5657
let serial = json::encode(&a).unwrap();
5758
println!("Encode {:?} => {:?}", a, serial);
5859
let res = json::decode::<RcArray<f32, _>>(&serial);
@@ -67,13 +68,13 @@ fn serial_wrong_count()
6768
{
6869
// one element too few
6970
let text = r##"{"v":1,"dim":[2,3],"data":[3,1,2.2,3.1,4]}"##;
70-
let arr = json::decode::<RcArray<f32, (Ix, Ix)>>(text);
71+
let arr = json::decode::<RcArray2<f32>>(text);
7172
println!("{:?}", arr);
7273
assert!(arr.is_err());
7374

7475
// future version
7576
let text = r##"{"v":200,"dim":[2,3],"data":[3,1,2.2,3.1,4,7]}"##;
76-
let arr = json::decode::<RcArray<f32, (Ix, Ix)>>(text);
77+
let arr = json::decode::<RcArray2<f32>>(text);
7778
println!("{:?}", arr);
7879
assert!(arr.is_err());
7980
}
@@ -95,7 +96,7 @@ fn serial_many_dim_serde()
9596
let a = arr1::<f32>(&[2.72, 1., 2.]);
9697
let serial = serde_json::to_string(&a).unwrap();
9798
println!("Serde encode {:?} => {:?}", a, serial);
98-
let res = serde_json::from_str::<RcArray<f32, _>>(&serial);
99+
let res = serde_json::from_str::<RcArray1<f32>>(&serial);
99100
println!("{:?}", res);
100101
assert_eq!(a, res.unwrap());
101102
}
@@ -104,18 +105,18 @@ fn serial_many_dim_serde()
104105
let a = arr2(&[[3., 1., 2.2], [3.1, 4., 7.]]);
105106
let serial = serde_json::to_string(&a).unwrap();
106107
println!("Serde encode {:?} => {:?}", a, serial);
107-
let res = serde_json::from_str::<RcArray<f32, _>>(&serial);
108+
let res = serde_json::from_str::<RcArray2<f32>>(&serial);
108109
println!("{:?}", res);
109110
assert_eq!(a, res.unwrap());
110111
let text = r##"{"v":1,"dim":[2,3],"data":[3,1,2.2,3.1,4,7]}"##;
111-
let b = serde_json::from_str::<RcArray<f32, (Ix, Ix)>>(text);
112+
let b = serde_json::from_str::<RcArray2<f32>>(text);
112113
assert_eq!(a, b.unwrap());
113114
}
114115

115116
{
116117
// Test a sliced array.
117118
let mut a = RcArray::linspace(0., 31., 32).reshape((2, 2, 2, 4));
118-
a.islice(&[Si(0, None, -1), S, S, Si(0, Some(2), 1)]);
119+
a.islice(s![..;-1, .., .., ..2]);
119120
let serial = serde_json::to_string(&a).unwrap();
120121
println!("Encode {:?} => {:?}", a, serial);
121122
let res = serde_json::from_str::<RcArray<f32, _>>(&serial);
@@ -130,13 +131,13 @@ fn serial_wrong_count_serde()
130131
{
131132
// one element too few
132133
let text = r##"{"v":1,"dim":[2,3],"data":[3,1,2.2,3.1,4]}"##;
133-
let arr = serde_json::from_str::<RcArray<f32, (Ix, Ix)>>(text);
134+
let arr = serde_json::from_str::<RcArray2<f32>>(text);
134135
println!("{:?}", arr);
135136
assert!(arr.is_err());
136137

137138
// future version
138139
let text = r##"{"v":200,"dim":[2,3],"data":[3,1,2.2,3.1,4,7]}"##;
139-
let arr = serde_json::from_str::<RcArray<f32, (Ix, Ix)>>(text);
140+
let arr = serde_json::from_str::<RcArray2<f32>>(text);
140141
println!("{:?}", arr);
141142
assert!(arr.is_err());
142143
}

0 commit comments

Comments
 (0)