forked from alemi/upub
feat: @context in base, actor fields, impl activity
This commit is contained in:
parent
042edaf29e
commit
db369683a0
4 changed files with 78 additions and 18 deletions
|
@ -30,7 +30,14 @@ pub trait Base {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn object() -> serde_json::Value {
|
pub fn object() -> serde_json::Value {
|
||||||
serde_json::Value::Object(serde_json::Map::default())
|
let mut map = serde_json::Map::default();
|
||||||
|
map.insert(
|
||||||
|
"@context".to_string(),
|
||||||
|
serde_json::Value::Array(vec![
|
||||||
|
serde_json::Value::String("https://www.w3.org/ns/activitystreams".into())
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
serde_json::Value::Object(map)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait BaseMut {
|
pub trait BaseMut {
|
||||||
|
|
|
@ -5,7 +5,7 @@ pub mod offer;
|
||||||
pub mod reject;
|
pub mod reject;
|
||||||
|
|
||||||
use crate::activitystream::Node;
|
use crate::activitystream::Node;
|
||||||
use crate::strenum;
|
use crate::{getter, setter, strenum};
|
||||||
use accept::AcceptType;
|
use accept::AcceptType;
|
||||||
use reject::RejectType;
|
use reject::RejectType;
|
||||||
use offer::OfferType;
|
use offer::OfferType;
|
||||||
|
@ -45,7 +45,7 @@ pub trait Activity : super::Object {
|
||||||
fn activity_type(&self) -> Option<ActivityType> { None }
|
fn activity_type(&self) -> Option<ActivityType> { None }
|
||||||
fn actor(&self) -> Node<impl super::Actor> { Node::Empty::<serde_json::Value> }
|
fn actor(&self) -> Node<impl super::Actor> { Node::Empty::<serde_json::Value> }
|
||||||
fn object(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
fn object(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
||||||
fn target(&self) -> Option<&str> { None }
|
fn target(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
||||||
fn result(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
fn result(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
||||||
fn origin(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
fn origin(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
||||||
fn instrument(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
fn instrument(&self) -> Node<impl super::Object> { Node::Empty::<serde_json::Value> }
|
||||||
|
@ -55,15 +55,28 @@ pub trait ActivityMut : super::ObjectMut {
|
||||||
fn set_activity_type(&mut self, val: Option<ActivityType>) -> &mut Self;
|
fn set_activity_type(&mut self, val: Option<ActivityType>) -> &mut Self;
|
||||||
fn set_actor(&mut self, val: Node<impl super::Actor>) -> &mut Self;
|
fn set_actor(&mut self, val: Node<impl super::Actor>) -> &mut Self;
|
||||||
fn set_object(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
fn set_object(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
||||||
fn set_target(&mut self, val: Option<&str>) -> &mut Self;
|
fn set_target(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
||||||
fn set_result(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
fn set_result(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
||||||
fn set_origin(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
fn set_origin(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
||||||
fn set_instrument(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
fn set_instrument(&mut self, val: Node<impl super::Object>) -> &mut Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Activity for serde_json::Value {
|
impl Activity for serde_json::Value {
|
||||||
fn activity_type(&self) -> Option<ActivityType> {
|
getter! { activity_type -> type ActivityType }
|
||||||
let serde_json::Value::String(t) = self.get("type")? else { return None };
|
getter! { actor -> node impl super::Actor }
|
||||||
ActivityType::try_from(t.as_str()).ok()
|
getter! { object -> node impl super::Object }
|
||||||
|
getter! { target -> node impl super::Object }
|
||||||
|
getter! { result -> node impl super::Object }
|
||||||
|
getter! { origin -> node impl super::Object }
|
||||||
|
getter! { instrument -> node impl super::Object }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ActivityMut for serde_json::Value {
|
||||||
|
setter! { activity_type -> type ActivityType }
|
||||||
|
setter! { actor -> node impl super::Actor }
|
||||||
|
setter! { object -> node impl super::Object }
|
||||||
|
setter! { target -> node impl super::Object }
|
||||||
|
setter! { result -> node impl super::Object }
|
||||||
|
setter! { origin -> node impl super::Object }
|
||||||
|
setter! { instrument -> node impl super::Object }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{activitystream::{Base, BaseType}, strenum};
|
use crate::{activitystream::Node, getter, setter, strenum};
|
||||||
|
|
||||||
use super::ObjectType;
|
use super::collection::Collection;
|
||||||
|
|
||||||
strenum! {
|
strenum! {
|
||||||
pub enum ActorType {
|
pub enum ActorType {
|
||||||
|
@ -14,17 +14,54 @@ strenum! {
|
||||||
|
|
||||||
pub trait Actor : super::Object {
|
pub trait Actor : super::Object {
|
||||||
fn actor_type(&self) -> Option<ActorType> { None }
|
fn actor_type(&self) -> Option<ActorType> { None }
|
||||||
|
fn preferred_username(&self) -> Option<&str> { None }
|
||||||
|
fn inbox(&self) -> Node<impl Collection>;
|
||||||
|
fn outbox(&self) -> Node<impl Collection>;
|
||||||
|
fn following(&self) -> Node<impl Collection> { Node::Empty::<serde_json::Value> }
|
||||||
|
fn followers(&self) -> Node<impl Collection> { Node::Empty::<serde_json::Value> }
|
||||||
|
fn liked(&self) -> Node<impl Collection> { Node::Empty::<serde_json::Value> }
|
||||||
|
fn streams(&self) -> Node<impl Collection> { Node::Empty::<serde_json::Value> }
|
||||||
|
fn endpoints(&self) -> Option<serde_json::Map<String, String>> { None }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ActorMut : super::ObjectMut {
|
pub trait ActorMut : super::ObjectMut {
|
||||||
fn set_actor_type(&mut self, val: Option<ActorType>) -> &mut Self;
|
fn set_actor_type(&mut self, val: Option<ActorType>) -> &mut Self;
|
||||||
|
fn set_preferred_username(&mut self, val: Option<&str>) -> &mut Self;
|
||||||
|
fn set_inbox(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_outbox(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_following(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_followers(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_liked(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_streams(&mut self, val: Node<impl Collection>) -> &mut Self;
|
||||||
|
fn set_endpoints(&mut self, val: Option<serde_json::Map<String, String>>) -> &mut Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Actor for serde_json::Value {
|
impl Actor for serde_json::Value {
|
||||||
fn actor_type(&self) -> Option<ActorType> {
|
getter! { actor_type -> type ActorType }
|
||||||
match self.base_type()? {
|
getter! { preferred_username::preferredUsername -> &str }
|
||||||
BaseType::Object(ObjectType::Actor(x)) => Some(x),
|
getter! { inbox -> node impl Collection }
|
||||||
_ => None,
|
getter! { outbox -> node impl Collection }
|
||||||
|
getter! { following -> node impl Collection }
|
||||||
|
getter! { followers -> node impl Collection }
|
||||||
|
getter! { liked -> node impl Collection }
|
||||||
|
getter! { streams -> node impl Collection }
|
||||||
|
|
||||||
|
fn endpoints(&self) -> Option<serde_json::Map<String, String>> {
|
||||||
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ActorMut for serde_json::Value {
|
||||||
|
setter! { actor_type -> type ActorType }
|
||||||
|
setter! { preferred_username::preferredUsername -> &str }
|
||||||
|
setter! { inbox -> node impl Collection }
|
||||||
|
setter! { outbox -> node impl Collection }
|
||||||
|
setter! { following -> node impl Collection }
|
||||||
|
setter! { followers -> node impl Collection }
|
||||||
|
setter! { liked -> node impl Collection }
|
||||||
|
setter! { streams -> node impl Collection }
|
||||||
|
|
||||||
|
fn set_endpoints(&mut self, val: Option<serde_json::Map<String, String>>) -> &mut Self {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,8 +66,11 @@ impl Activity for Model {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn target(&self) -> Option<&str> {
|
fn target(&self) -> Node<impl Object> {
|
||||||
self.target.as_deref()
|
match &self.target {
|
||||||
|
None => Node::Empty::<serde_json::Value>,
|
||||||
|
Some(x) => Node::Link(Box::new(x.clone())),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +81,7 @@ impl Model {
|
||||||
activity_type: activity.activity_type().ok_or(super::FieldError("type"))?,
|
activity_type: activity.activity_type().ok_or(super::FieldError("type"))?,
|
||||||
actor: activity.actor().id().ok_or(super::FieldError("actor"))?.to_string(),
|
actor: activity.actor().id().ok_or(super::FieldError("actor"))?.to_string(),
|
||||||
object: activity.object().id().map(|x| x.to_string()),
|
object: activity.object().id().map(|x| x.to_string()),
|
||||||
target: activity.target().map(|x| x.to_string()),
|
target: activity.target().id().map(|x| x.to_string()),
|
||||||
published: activity.published().ok_or(super::FieldError("published"))?,
|
published: activity.published().ok_or(super::FieldError("published"))?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue