; feed/normalize — coerce arbitrary input into the canonical activity record. ; An activity is a small dict {:actor :verb :object :at :tags}; a stream is an ; APL vector of such dicts (see stream.sx). Extra keys on the raw input survive ; (e.g. :visible-to for ACL, peer metadata for federation) — :tags is the ; flexible bag but the record is not closed. (define feed/activity-keys (list :actor :verb :object :at :tags)) (define feed/normalize (fn (raw) (let ((d (if (= (type-of raw) "dict") raw {}))) (merge d {:actor (get d :actor "") :object (get d :object nil) :at (get d :at 0) :tags (let ((t (get d :tags (list)))) (if (list? t) t (list t))) :verb (get d :verb "post")})))) (define feed/activity (fn (actor verb object at tags) (feed/normalize {:actor actor :object object :at at :tags tags :verb verb}))) (define feed/actor (fn (a) (get a :actor))) (define feed/verb (fn (a) (get a :verb))) (define feed/object (fn (a) (get a :object))) (define feed/at (fn (a) (get a :at))) (define feed/tags (fn (a) (get a :tags))) (define feed/activity? (fn (a) (and (= (type-of a) "dict") (has-key? a :actor) (has-key? a :verb))))