diff options
-rw-r--r-- | Cargo.toml | 16 | ||||
-rw-r--r-- | src/backend/datetime.rs | 24 | ||||
-rw-r--r-- | src/backend/mime.rs | 22 | ||||
-rw-r--r-- | src/backend/mod.rs | 9 | ||||
-rw-r--r-- | src/backend/node.rs | 3 | ||||
-rw-r--r-- | src/backend/payload.rs | 10 |
6 files changed, 78 insertions, 6 deletions
@@ -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>, +} + |