/* * This file is part of ActivityStreams. * * Copyright © 2018 Riley Trautman * * ActivityStreams is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ActivityStreams is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ActivityStreams. If not, see . */ use chrono::{offset::Utc, DateTime}; use mime; use serde_json::{self, Value}; use collection::Collection; use error::{Error, Result}; use link::Link; use object::{Image, Object}; pub type UtcTime = DateTime; #[derive(Clone, Debug, Serialize, Deserialize, Properties)] #[serde(rename_all = "camelCase")] pub struct ObjectProperties { #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String), functional)] id: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] attachment: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] attributed_to: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] audience: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String))] content: Option, #[serde(skip_serializing_if = "Option::is_none", rename = "@context")] #[activitystreams(concrete(Value), functional)] context: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String))] name: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String, UtcTime), functional)] end_time: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] generator: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Link), concrete(Image))] icon: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Link), concrete(Image))] image: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] in_reply_to: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] location: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] preview: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String, UtcTime), functional)] published: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(Collection), functional)] replies: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String, UtcTime), functional)] start_time: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String))] summary: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] tag: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String, UtcTime), functional)] updated: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String), ab(Link))] url: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] to: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] bto: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] cc: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(ab(Object, Link))] bcc: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String), functional)] media_type: Option, // TODO: xsd:duration #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String), functional)] duration: Option, } impl ObjectProperties { pub fn media_type(&self) -> Result { self.media_type_string() .and_then(|s| s.parse().map_err(|_| Error::Deserialize)) } } #[derive(Clone, Debug, Serialize, Deserialize, Properties)] #[serde(rename_all = "camelCase")] pub struct PlaceProperties { #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(f64), functional)] accuracy: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(f64), functional)] altitude: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(f64), functional)] latitude: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(f64), functional)] longitude: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(f64), functional)] radius: Option, } #[derive(Clone, Debug, Serialize, Deserialize, Properties)] #[serde(rename_all = "camelCase")] pub struct TombstoneProperties { #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String))] former_type: Option, #[serde(skip_serializing_if = "Option::is_none")] #[activitystreams(concrete(String, UtcTime), functional)] deleted: Option, }