summaryrefslogtreecommitdiffstats
path: root/src/backend/mime.rs
blob: 9ea1cb85931e93dca8dac535b723cce55940f5b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use anyhow::Error;

#[derive(Debug, Eq, PartialEq)]
pub struct MimeType(mime::Mime);

impl From<mime::Mime> for MimeType {
    fn from(mime: mime::Mime) -> Self {
        MimeType(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)
    }
}