diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-04-29 21:44:31 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-04-29 21:44:31 +0200 |
commit | be71f0b4b907ef1d1bbc4dfefad5b20d4b94bd92 (patch) | |
tree | 67b040d63adc9f982bcbadfa456d64466f2b0815 | |
parent | c3c231c79380ea3c7ecc118412f7861b6833eccd (diff) |
Add methods to deep-load one block
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/types/block.rs | 27 | ||||
-rw-r--r-- | src/types/content.rs | 23 | ||||
-rw-r--r-- | src/types/payload.rs | 75 |
3 files changed, 124 insertions, 1 deletions
diff --git a/src/types/block.rs b/src/types/block.rs index 7b86783..ccab9af 100644 --- a/src/types/block.rs +++ b/src/types/block.rs @@ -1,5 +1,11 @@ use crate::types::util::IPFSHash; use crate::types::util::Version; +use crate::types::content::Content; +use crate::types::payload::*; +use crate::types::content::LoadedContent; +use crate::repository::repository::Repository; + +use failure::Error; #[derive(Serialize, Deserialize, Debug)] pub struct Block { @@ -35,6 +41,19 @@ impl Block { pub fn content(&self) -> &IPFSHash { &self.content } + + pub async fn load(self, r: &Repository) -> Result<LoadedBlock, Error> { + Ok({ + LoadedBlock { + version: self.version, + parents: self.parents, + content: r.get_content(&self.content) + .await? + .load(r) + .await? + } + }) + } } impl AsRef<Block> for Block { @@ -42,3 +61,11 @@ impl AsRef<Block> for Block { &self } } + +#[derive(Debug)] +pub struct LoadedBlock { + version: Version, + parents: Vec<IPFSHash>, + content: LoadedContent, +} + diff --git a/src/types/content.rs b/src/types/content.rs index c22a41f..be762f5 100644 --- a/src/types/content.rs +++ b/src/types/content.rs @@ -1,10 +1,14 @@ use std::collections::BTreeMap; +use failure::Error; + use crate::types::util::IPFSHash; use crate::types::util::IPNSHash; use crate::types::util::MimeType; use crate::types::util::Timestamp; -use crate::types::payload::*; +use crate::types::payload::Payload; +use crate::types::payload::LoadedPayload; +use crate::repository::repository::Repository; #[derive(Serialize, Deserialize, Debug)] pub struct Content { @@ -59,6 +63,16 @@ impl Content { self.devices.push(dev); } + pub async fn load(self, r: &Repository) -> Result<LoadedContent, Error> { + Ok({ + LoadedContent { + devices: self.devices, + timestamp: self.timestamp, + payload: self.payload.load(r).await? + } + }) + } + } impl AsRef<Content> for Content { @@ -67,3 +81,10 @@ impl AsRef<Content> for Content { } } +#[derive(Debug)] +pub struct LoadedContent { + devices: Vec<IPNSHash>, + timestamp: Option<Timestamp>, + payload: LoadedPayload, +} + diff --git a/src/types/payload.rs b/src/types/payload.rs index 1e3b011..da4b95f 100644 --- a/src/types/payload.rs +++ b/src/types/payload.rs @@ -1,9 +1,12 @@ use std::collections::BTreeMap; +use failure::Error; + use crate::types::util::IPFSHash; use crate::types::util::IPNSHash; use crate::types::util::MimeType; use crate::types::util::Timestamp; +use crate::repository::repository::Repository; /// The Payload type represents the Payload of a Content object @@ -162,6 +165,54 @@ impl Payload { _ => false, } } + + pub async fn load(self, r: &Repository) -> Result<LoadedPayload, Error> { + match self { + Payload::None => Ok(LoadedPayload::None), + Payload::Post { + content_format, + content, + reply_to, + comments_will_be_propagated, + comments_propagated_until + } => { + Ok({ + LoadedPayload::Post { + content_format, + content: r.get_raw_bytes(content).await?, + reply_to, + comments_will_be_propagated, + comments_propagated_until + } + }) + }, + + Payload::AttachedPostComments { comments_for, refs } => { + Ok({ + LoadedPayload::AttachedPostComments { + comments_for, + refs + } + }) + }, + + Payload::Profile { names, picture, more } => { + let picture = if let Some(p) = picture { + Some(r.get_raw_bytes(p).await?) + } else { + None + }; + + Ok({ + LoadedPayload::Profile { + names, + picture, + more + } + }) + } + } + } } #[derive(Serialize, Deserialize, Debug)] @@ -173,3 +224,27 @@ pub struct Userdata { data: IPFSHash, } +#[derive(Debug)] +pub enum LoadedPayload { + None, + + Post { + content_format: MimeType, + content: Vec<u8>, + reply_to: Option<IPFSHash>, + comments_will_be_propagated: Option<bool>, + comments_propagated_until: Option<Timestamp>, + }, + + AttachedPostComments { + comments_for: IPFSHash, + refs: Vec<IPFSHash>, + }, + + Profile { + names: Vec<String>, + picture: Option<Vec<u8>>, + more: BTreeMap<String, Userdata>, + }, +} + |