You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.6 KiB
Rust
67 lines
1.6 KiB
Rust
use crate::ap::processor::process_document;
|
|
use async_trait::async_trait;
|
|
use mime::Mime;
|
|
use serde::{de, de::Visitor, Deserialize, Deserializer, Serialize, Serializer};
|
|
use std::fmt;
|
|
use std::str::FromStr;
|
|
|
|
use super::Job;
|
|
use crate::core::*;
|
|
use crate::state::AppState;
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
pub struct InboxWorker {
|
|
raw: String,
|
|
#[serde(
|
|
serialize_with = "serialize_mime",
|
|
deserialize_with = "deserialize_mime"
|
|
)]
|
|
mime: Mime,
|
|
}
|
|
|
|
impl InboxWorker {
|
|
pub fn new(raw: String, mime: Mime) -> InboxWorker {
|
|
InboxWorker { raw, mime }
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Job for InboxWorker {
|
|
async fn perform(&self, state: &AppState) -> Result<()> {
|
|
process_document(state, &self.raw, &self.mime).await
|
|
}
|
|
|
|
fn name(&self) -> &'static str {
|
|
"inbox"
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for InboxWorker {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
write!(f, "ActivityPub ingress: {}", &self.raw)
|
|
}
|
|
}
|
|
|
|
fn serialize_mime<S: Serializer>(val: &Mime, ser: S) -> StdResult<S::Ok, S::Error> {
|
|
let string = format!("{val}");
|
|
ser.serialize_str(&string)
|
|
}
|
|
|
|
struct MimeVisitor;
|
|
|
|
impl<'de> Visitor<'de> for MimeVisitor {
|
|
type Value = Mime;
|
|
|
|
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
f.write_str("a valid MIME media type")
|
|
}
|
|
|
|
fn visit_str<E: de::Error>(self, val: &str) -> StdResult<Mime, E> {
|
|
Mime::from_str(val).map_err(|e| E::custom(e.to_string()))
|
|
}
|
|
}
|
|
|
|
fn deserialize_mime<'de, D: Deserializer<'de>>(de: D) -> StdResult<Mime, D::Error> {
|
|
de.deserialize_str(MimeVisitor)
|
|
}
|