summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml16
-rw-r--r--src/backend/datetime.rs24
-rw-r--r--src/backend/mime.rs22
-rw-r--r--src/backend/mod.rs9
-rw-r--r--src/backend/node.rs3
-rw-r--r--src/backend/payload.rs10
6 files changed, 78 insertions, 6 deletions
diff --git a/Cargo.toml b/Cargo.toml
index b924dd5..f24ae6f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,9 +19,13 @@ edition = "2018"
# TODO: Replace with thiserror
anyhow = "1"
-async-trait = "0.1"
-cid = "0.6"
-daglib = { git = "https://git.sr.ht/~matthiasbeyer/daglib", branch = "master" }
-ipfs-embed = "0.19"
-libipld = "0.11"
-tokio = { version = "1", features = ["full"] }
+async-trait = "0.1"
+cid = "0.6"
+chrono = "0.4"
+daglib = { git = "https://git.sr.ht/~matthiasbeyer/daglib", branch = "master" }
+ipfs-embed = "0.19"
+libipld = "0.11"
+libipld-cbor = "0.11"
+mime = "0.3"
+tokio = { version = "1", features = ["full"] }
+
diff --git a/src/backend/datetime.rs b/src/backend/datetime.rs
new file mode 100644
index 0000000..650a159
--- /dev/null
+++ b/src/backend/datetime.rs
@@ -0,0 +1,24 @@
+use anyhow::Error;
+
+#[derive(Debug, Eq, PartialEq)]
+pub struct DateTime(chrono::DateTime<chrono::Utc>);
+
+impl libipld::codec::Encode<libipld_cbor::DagCborCodec> for DateTime {
+ fn encode<W: std::io::Write>(&self, c: libipld_cbor::DagCborCodec, w: &mut W) -> libipld::error::Result<()> {
+ self.0.to_rfc3339().encode(c, w).map_err(Error::from)
+ }
+}
+
+impl libipld::codec::Decode<libipld_cbor::DagCborCodec> for DateTime {
+ fn decode<R: std::io::Read + std::io::Seek>(c: libipld_cbor::DagCborCodec, r: &mut R) -> libipld::error::Result<Self> {
+ String::decode(c, r)
+ .map_err(Error::from)
+ .and_then(|s| {
+ chrono::DateTime::parse_from_rfc3339(&s)
+ .map(|dt| dt.with_timezone(&chrono::Utc))
+ .map_err(Error::from)
+ })
+ .map(DateTime)
+ }
+}
+
diff --git a/src/backend/mime.rs b/src/backend/mime.rs
new file mode 100644
index 0000000..d65761e
--- /dev/null
+++ b/src/backend/mime.rs
@@ -0,0 +1,22 @@
+use anyhow::Error;
+
+#[derive(Debug, Eq, PartialEq)]
+pub struct MimeType(mime::Mime);
+
+impl<C: libipld::codec::Codec> libipld::codec::Encode<C> for MimeType {
+ fn encode<W: std::io::Write>(&self, _c: C, w: &mut W) -> libipld::error::Result<()> {
+ w.write_all(self.0.essence_str().as_bytes()).map_err(Error::from)
+ }
+}
+
+impl libipld::codec::Decode<libipld_cbor::DagCborCodec> for MimeType {
+ fn decode<R: std::io::Read + std::io::Seek>(c: libipld_cbor::DagCborCodec, r: &mut R) -> libipld::error::Result<Self> {
+ use std::str::FromStr;
+
+ String::decode(c, r)
+ .map_err(Error::from)
+ .and_then(|s| mime::Mime::from_str(&s).map_err(Error::from))
+ .map(MimeType)
+ }
+}
+
diff --git a/src/backend/mod.rs b/src/backend/mod.rs
index 24f907c..2a35e82 100644
--- a/src/backend/mod.rs
+++ b/src/backend/mod.rs
@@ -6,3 +6,12 @@ pub use node::*;
mod backend;
pub use backend::*;
+
+mod datetime;
+pub use datetime::*;
+
+mod mime;
+pub use self::mime::*;
+
+mod payload;
+pub use payload::*;
diff --git a/src/backend/node.rs b/src/backend/node.rs
index c819d3e..7a649ca 100644
--- a/src/backend/node.rs
+++ b/src/backend/node.rs
@@ -5,6 +5,9 @@ pub struct Node {
/// Parent Nodes, identified by cid
parents: Vec<crate::backend::Id>,
+
+ /// The actual payload of the node, which is stored in another document identified by this cid
+ payload: cid::Cid,
}
impl daglib::Node for Node {
diff --git a/src/backend/payload.rs b/src/backend/payload.rs
new file mode 100644
index 0000000..fcddb50
--- /dev/null
+++ b/src/backend/payload.rs
@@ -0,0 +1,10 @@
+use crate::backend::DateTime;
+use crate::backend::MimeType;
+
+#[derive(Debug, Eq, PartialEq, libipld::DagCbor)]
+pub struct Payload {
+ mime: MimeType,
+ timestamp: DateTime,
+ content: Vec<u8>,
+}
+