diff --git a/Cargo.toml b/Cargo.toml index e724900..b80c89c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,11 +17,13 @@ io = ["csv", "rustc-serialize"] [dependencies] num = {version = "0.1.36", default-features = false } matrixmultiply = "0.1.13" +serde = {version = "1", optional = true, features = ["derive"]} [dev-dependencies] rand = "0.3" quickcheck = "0.4" itertools = "0.5.9" +serde_test = "1" [dependencies.csv] version = "0.14.7" diff --git a/src/lib.rs b/src/lib.rs index ddd7213..ce78cb9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -109,6 +109,12 @@ mod testsupport; #[macro_use] extern crate quickcheck; +#[cfg(feature = "serde")] +#[macro_use] +extern crate serde; +#[cfg(all(feature = "serde", test))] +extern crate serde_test; + #[cfg(test)] extern crate itertools; diff --git a/src/matrix/mod.rs b/src/matrix/mod.rs index 369fcac..1a9749a 100644 --- a/src/matrix/mod.rs +++ b/src/matrix/mod.rs @@ -41,6 +41,7 @@ pub enum Axes { /// The `Matrix` struct. /// /// Can be instantiated with any type. +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Matrix { rows: usize, @@ -477,4 +478,32 @@ mod tests { assert_matrix_eq!(mat, matrix![5, 2; 6, 4]); } + + #[cfg(all(feature = "serde", test))] + fn serde() { + use serde_test::{Token, assert_tokens}; + + let mat = matrix![1., 2.; + 3., 4.]; + + assert_tokens(&mat, &[ + Token::Struct{name: "Matrix", len:3}, + + Token::Str("rows"), + Token::U64(2), + + Token::Str("cols"), + Token::U64(2), + + Token::Str("data"), + Token::Seq{len:Some(4)}, + Token::F64(1.), + Token::F64(2.), + Token::F64(3.), + Token::F64(4.), + Token::SeqEnd, + + Token::StructEnd + ]); + } } diff --git a/src/vector/mod.rs b/src/vector/mod.rs index f576505..954214c 100644 --- a/src/vector/mod.rs +++ b/src/vector/mod.rs @@ -9,8 +9,36 @@ mod impl_vec; /// The Vector struct. /// /// Can be instantiated with any type. +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Eq, Hash)] pub struct Vector { size: usize, data: Vec, -} \ No newline at end of file +} + +#[cfg(test)] +mod tests { + #[cfg(all(feature = "serde", test))] + fn serde_test() { + use serde_test::{Token, assert_tokens}; + + let vec = vector![1., 2., 3., 4.]; + + assert_tokens(&vec, &[ + Token::Struct{name: "Vector", len:2}, + + Token::Str("size"), + Token::U64(4), + + Token::Str("data"), + Token::Seq{len:Some(4)}, + Token::F64(1.), + Token::F64(2.), + Token::F64(3.), + Token::F64(4.), + Token::SeqEnd, + + Token::StructEnd + ]); + } +}