summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-04-29 21:44:31 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-04-29 21:44:31 +0200
commitbe71f0b4b907ef1d1bbc4dfefad5b20d4b94bd92 (patch)
tree67b040d63adc9f982bcbadfa456d64466f2b0815
parentc3c231c79380ea3c7ecc118412f7861b6833eccd (diff)
Add methods to deep-load one block
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/types/block.rs27
-rw-r--r--src/types/content.rs23
-rw-r--r--src/types/payload.rs75
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>,
+ },
+}
+