lemmy/server/src/apub/group_wrapper.rs
2020-03-11 18:26:58 +01:00

92 lines
3.2 KiB
Rust

use crate::to_datetime_utc;
use activitypub::actor::Group;
use chrono::{DateTime, NaiveDateTime};
use failure::Error;
use serde_json::Value;
pub trait GroupHelper {
fn set_id(group: &mut Group, id: &str);
fn get_id(group: &Group) -> Result<String, Error>;
fn set_title(group: &mut Group, title: &str);
fn get_title(group: &Group) -> Result<String, Error>;
fn set_description(group: &mut Group, description: &Option<String>);
fn get_description(group: &Group) -> Result<Option<String>, Error>;
fn set_creator_id(group: &mut Group, creator_id: String);
fn get_creator_id(group: &Group) -> Result<String, Error>;
fn set_published(group: &mut Group, published: NaiveDateTime);
fn get_published(group: &Group) -> Result<NaiveDateTime, Error>;
fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>);
fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error>;
}
// TODO: something is crashing and not reporting the error
impl GroupHelper for Group {
fn set_id(group: &mut Group, id: &str) {
group.object_props.id = Some(Value::String(id.to_string()));
}
fn get_id(group: &Group) -> Result<String, Error> {
Ok(get_string_value(group.clone().object_props.id))
}
fn set_title(group: &mut Group, title: &str) {
group.object_props.name = Some(Value::String(title.to_string()));
}
fn get_title(group: &Group) -> Result<String, Error> {
Ok(get_string_value(group.to_owned().object_props.name))
}
fn set_description(group: &mut Group, description: &Option<String>) {
group.object_props.summary = description.as_ref().map(|d| Value::String(d.to_string()));
}
fn get_description(group: &Group) -> Result<Option<String>, Error> {
Ok(get_string_value_opt(group.to_owned().object_props.summary))
}
fn set_creator_id(group: &mut Group, creator_id: String) {
group.object_props.attributed_to = Some(Value::String(creator_id.to_string()));
}
fn get_creator_id(group: &Group) -> Result<String, Error> {
Ok(get_string_value(group.clone().object_props.attributed_to))
}
fn set_published(group: &mut Group, published: NaiveDateTime) {
group.object_props.published = Some(Value::String(to_datetime_utc(published).to_string()))
}
fn get_published(group: &Group) -> Result<NaiveDateTime, Error> {
let str = get_string_value(group.to_owned().object_props.published);
// TODO: date parsing is failing, no idea if this is even the right format
dbg!(&str);
let date = DateTime::parse_from_rfc2822(&str)?;
dbg!(&date);
Ok(date.naive_local())
}
fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>) {
group.object_props.updated = updated.map(|u| Value::String(u.to_string()));
}
fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error> {
let str = get_string_value_opt(group.to_owned().object_props.updated);
match str {
Some(s) => Ok(Some(DateTime::parse_from_rfc2822(&s)?.naive_local())),
None => Ok(None),
}
}
}
fn get_string_value_opt(value: Option<Value>) -> Option<String> {
value
.as_ref()
.map(Value::as_str)
.flatten()
.map(str::to_string)
}
fn get_string_value(value: Option<Value>) -> String {
get_string_value_opt(value).unwrap()
}