use rustc_serialize::{Decoder, Encodable, Encoder};
pub use structured_data::StructuredData;
pub use immutable_data::{ImmutableData, ImmutableDataType};
pub use plain_data::PlainData;
use NameType;
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, RustcEncodable, RustcDecodable)]
pub enum Data {
StructuredData(StructuredData),
ImmutableData(ImmutableData),
PlainData(PlainData),
}
impl Data {
pub fn name(&self) -> NameType {
match *self {
Data::StructuredData(ref d) => d.name(),
Data::ImmutableData(ref d) => d.name(),
Data::PlainData(ref d) => d.name(),
}
}
pub fn payload_size(&self) -> usize {
match *self {
Data::StructuredData(ref d) => d.payload_size(),
Data::ImmutableData(ref d) => d.payload_size(),
Data::PlainData(ref d) => d.payload_size(),
}
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, RustcEncodable, RustcDecodable)]
pub enum DataRequest {
StructuredData(NameType, u64),
ImmutableData(NameType, ImmutableDataType),
PlainData(NameType),
}
impl DataRequest {
pub fn name(&self) -> NameType {
match *self {
DataRequest::StructuredData(ref name, tag) => StructuredData::compute_name(tag, name),
DataRequest::ImmutableData(ref name, _) => name.clone(),
DataRequest::PlainData(ref name) => name.clone(),
}
}
}
#[cfg(test)]
mod test {
#[test]
fn data_name() {
let keys = ::sodiumoxide::crypto::sign::gen_keypair();
let owner_keys = vec![keys.0];
match ::structured_data::StructuredData::new(0,
::test_utils::Random::generate_random(),
0,
vec![],
owner_keys.clone(),
vec![],
Some(&keys.1)) {
Ok(structured_data) => {
assert_eq!(
structured_data.name(),
::data::Data::StructuredData(structured_data).name()
);
},
Err(error) => panic!("Error: {:?}", error),
}
let value = "immutable data value".to_string().into_bytes();
let immutable_data = ::immutable_data::ImmutableData::new(
::immutable_data::ImmutableDataType::Normal,
value);
assert_eq!(immutable_data.name(), ::data::Data::ImmutableData(immutable_data).name());
let name = ::name_type::NameType(::sodiumoxide::crypto::hash::sha512::hash(&vec![]).0);
let plain_data = ::plain_data::PlainData::new(name, vec![]);
assert_eq!(plain_data.name(), ::data::Data::PlainData(plain_data).name());
}
#[test]
fn data_payload_size() {
let keys = ::sodiumoxide::crypto::sign::gen_keypair();
let owner_keys = vec![keys.0];
match ::structured_data::StructuredData::new(0,
::test_utils::Random::generate_random(),
0,
vec![],
owner_keys.clone(),
vec![],
Some(&keys.1)) {
Ok(structured_data) => {
assert_eq!(
structured_data.payload_size(),
::data::Data::StructuredData(structured_data).payload_size()
);
},
Err(error) => panic!("Error: {:?}", error),
}
let value = "immutable data value".to_string().into_bytes();
let immutable_data = ::immutable_data::ImmutableData::new(
::immutable_data::ImmutableDataType::Normal,
value);
assert_eq!(
immutable_data.payload_size(),
::data::Data::ImmutableData(immutable_data).payload_size()
);
let name = ::name_type::NameType(::sodiumoxide::crypto::hash::sha512::hash(&vec![]).0);
let plain_data = ::plain_data::PlainData::new(name, vec![]);
assert_eq!(plain_data.payload_size(), ::data::Data::PlainData(plain_data).payload_size());
}
#[test]
fn data_request_name() {
let name = ::name_type::NameType(::sodiumoxide::crypto::hash::sha512::hash(&vec![]).0);
let tag = 0;
assert_eq!(
::structured_data::StructuredData::compute_name(tag, &name),
::data::DataRequest::StructuredData(name, tag).name()
);
let actual_name = ::data::DataRequest::ImmutableData(
name, ::immutable_data::ImmutableDataType::Normal).name();
assert_eq!(name.clone(), actual_name);
assert_eq!(name.clone(), ::data::DataRequest::PlainData(name).name());
}
}