summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-05-29 11:38:06 +0300
committerLars Wirzenius <liw@liw.fi>2021-05-29 15:20:23 +0300
commitcc62aac1a3ebdb1bf48a6520d430ad80948bcd51 (patch)
treeceb26e1a122e29e6e93986884a883fd628d4d58c
parent08b71890de3407acc323f09330ebe8a8ee2782ec (diff)
downloadobnam2-cc62aac1a3ebdb1bf48a6520d430ad80948bcd51.tar.gz
refactor: make metadata part of a chunk
This makes is harder to accidentally use the wrong metadata for a chunk.
-rw-r--r--src/chunk.rs2
-rw-r--r--src/chunkmeta.rs21
2 files changed, 21 insertions, 2 deletions
diff --git a/src/chunk.rs b/src/chunk.rs
index 50a2fc7..8631fd9 100644
--- a/src/chunk.rs
+++ b/src/chunk.rs
@@ -10,7 +10,7 @@ use std::default::Default;
///
/// A chunk also contains its associated metadata, except its
/// identifier.
-#[derive(Debug, Clone, Serialize, Deserialize)]
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DataChunk {
data: Vec<u8>,
meta: ChunkMeta,
diff --git a/src/chunkmeta.rs b/src/chunkmeta.rs
index 37e2ed5..73d9007 100644
--- a/src/chunkmeta.rs
+++ b/src/chunkmeta.rs
@@ -80,10 +80,20 @@ impl ChunkMeta {
&self.sha256
}
+ /// Serialize from a textual JSON representation.
+ pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
+ serde_json::from_str(json)
+ }
+
/// Serialize as JSON.
pub fn to_json(&self) -> String {
serde_json::to_string(self).unwrap()
}
+
+ /// Serialize as JSON, as a byte vector.
+ pub fn to_json_vec(&self) -> Vec<u8> {
+ self.to_json().as_bytes().to_vec()
+ }
}
impl FromStr for ChunkMeta {
@@ -135,10 +145,19 @@ mod test {
}
#[test]
- fn json_roundtrip() {
+ fn generation_json_roundtrip() {
let meta = ChunkMeta::new_generation("abcdef", "2020-09-17T08:17:13+03:00");
let json = serde_json::to_string(&meta).unwrap();
let meta2 = serde_json::from_str(&json).unwrap();
assert_eq!(meta, meta2);
}
+
+ #[test]
+ fn data_json_roundtrip() {
+ let meta = ChunkMeta::new("abcdef");
+ let json = meta.to_json_vec();
+ let meta2 = serde_json::from_slice(&json).unwrap();
+ assert_eq!(meta, meta2);
+ assert_eq!(meta.to_json_vec(), meta2.to_json_vec());
+ }
}