Clean up and use another design
This commit is contained in:
parent
7909196650
commit
d3a42aabaf
3 changed files with 117 additions and 148 deletions
117
src/as2.lisp
Normal file
117
src/as2.lisp
Normal file
|
@ -0,0 +1,117 @@
|
|||
;;;; -*- mode: common-lisp; coding: utf-8; -*-
|
||||
|
||||
(defpackage :ml-as2
|
||||
(:use :cl)
|
||||
(:export #:define-property-method
|
||||
#:define-property-methods
|
||||
#:object
|
||||
#:link
|
||||
#:attachment
|
||||
#:attributed-to
|
||||
#:audience
|
||||
#:content
|
||||
#:context
|
||||
#:name
|
||||
#:end-time
|
||||
#:generator
|
||||
#:icon
|
||||
#:image
|
||||
#:in-reply-to
|
||||
#:location
|
||||
#:preview
|
||||
#:published
|
||||
#:replies
|
||||
#:start-time
|
||||
#:summary
|
||||
#:tag
|
||||
#:updated
|
||||
#:url
|
||||
#:to
|
||||
#:bto
|
||||
#:cc
|
||||
#:bcc
|
||||
#:media-type
|
||||
#:duration
|
||||
#:href
|
||||
#:rel
|
||||
#:media-type
|
||||
#:name
|
||||
#:hreflang
|
||||
#:height
|
||||
#:width
|
||||
#:preview))
|
||||
|
||||
(in-package #:ml-as2)
|
||||
|
||||
(defun kebab-camel (kebab-string)
|
||||
"Transform KEBAB-STRING as kebab-case to camelCase."
|
||||
(with-output-to-string (out)
|
||||
(loop :with capitalize = nil
|
||||
:for char :across kebab-string
|
||||
:do (cond ((char= char #\-)
|
||||
(setf capitalize t))
|
||||
(capitalize
|
||||
(write-char (char-upcase char) out)
|
||||
(setf capitalize nil))
|
||||
(t (write-char (char-downcase char) out))))))
|
||||
|
||||
(defclass property-container ()
|
||||
((properties :initform (make-hash-table :test #'equal)
|
||||
:accessor properties)))
|
||||
|
||||
(defmethod initialize-instance :after ((obj property-container) &key)
|
||||
(setf (gethash "type" (properties obj))
|
||||
(string-capitalize (class-name (class-of obj)))))
|
||||
|
||||
(defmacro define-property-method (class-name name)
|
||||
`(defmethod ,name ((obj ,class-name) &optional value)
|
||||
(let ((key ,(kebab-camel (string-downcase (symbol-name name)))))
|
||||
(if value
|
||||
(prog1 obj
|
||||
(setf (gethash key (properties obj)) value))
|
||||
(gethash key (properties obj))))))
|
||||
|
||||
(defmacro define-property-methods (class-name &rest property-names)
|
||||
`(progn
|
||||
,@(loop for name in property-names
|
||||
collect `(define-property-method ,class-name ,name))))
|
||||
|
||||
(defclass object (property-container) ())
|
||||
(define-property-methods object
|
||||
attachment
|
||||
attributed-to
|
||||
audience
|
||||
content
|
||||
context
|
||||
name
|
||||
end-time
|
||||
generator
|
||||
icon
|
||||
image
|
||||
in-reply-to
|
||||
location
|
||||
preview
|
||||
published
|
||||
replies
|
||||
start-time
|
||||
summary
|
||||
tag
|
||||
updated
|
||||
url
|
||||
to
|
||||
bto
|
||||
cc
|
||||
bcc
|
||||
media-type
|
||||
duration)
|
||||
|
||||
(defclass link (property-container) ())
|
||||
(define-property-methods link
|
||||
href
|
||||
rel
|
||||
media-type
|
||||
name
|
||||
hreflang
|
||||
height
|
||||
width
|
||||
preview)
|
|
@ -1,33 +0,0 @@
|
|||
;;;; -*- mode: common-lisp; coding: utf-8; -*-
|
||||
|
||||
(in-package :ml-as2)
|
||||
|
||||
(defclass application ()
|
||||
((type :initarg :type
|
||||
:initform "Application"
|
||||
:accessor actor-type
|
||||
:documentation "Any kind of software.")))
|
||||
|
||||
(defclass group ()
|
||||
((type :initarg :type
|
||||
:initform "Group"
|
||||
:accessor actor-type
|
||||
:documentation "Any kind of software.")))
|
||||
|
||||
(defclass organization ()
|
||||
((type :initarg :type
|
||||
:initform "Organization"
|
||||
:accessor actor-type
|
||||
:documentation "Any kind of software.")))
|
||||
|
||||
(defclass person ()
|
||||
((type :initarg :type
|
||||
:initform "Person"
|
||||
:accessor actor-type
|
||||
:documentation "Any kind of software.")))
|
||||
|
||||
(defclass service ()
|
||||
((type :initarg :type
|
||||
:initform "Service"
|
||||
:accessor actor-type
|
||||
:documentation "Any kind of software.")))
|
|
@ -1,115 +0,0 @@
|
|||
;;;; -*- mode: common-lisp; coding: utf-8; -*-
|
||||
|
||||
(defpackage :ml-as2
|
||||
(:use :cl)
|
||||
(:export #:object))
|
||||
|
||||
(in-package :ml-as2)
|
||||
|
||||
(defclass object ()
|
||||
((id :initarg :id
|
||||
:accessor object-id
|
||||
:documentation "The Object is the primary base type for the Activity Streams vocabulary.")
|
||||
(type :initarg :type
|
||||
:accessor object-type
|
||||
:documentation "Identifies the Object or Link type.")
|
||||
(attachment :initarg :attachment
|
||||
:accessor object-attachment
|
||||
:documentation "Identifies a resource attached or related to an object that potentially requires special handling.")
|
||||
(attributed-to :initarg :attributed-to
|
||||
:accessor object-attributed-to
|
||||
:documentation "Identifies one or more entities to which this object is attributed.")
|
||||
(audience :initarg :audience
|
||||
:accessor object-audience
|
||||
:documentation "Identifies one or more entities that represent the total population of entities for which the object can considered to be relevant.")
|
||||
(content :initarg :content
|
||||
:accessor object-content
|
||||
:documentation "The content or textual representation of the Object encoded as a JSON string.")
|
||||
(context :initarg :context
|
||||
:accessor object-context
|
||||
:documentation "Identifies the context within which the object exists or an activity was performed.")
|
||||
(content-map :initarg :content-map
|
||||
:accessor object-content-map
|
||||
:documentation "The content or textual representation of the Object encoded as a language map.")
|
||||
(name :initarg :name
|
||||
:accessor object-name
|
||||
:documentation "A simple, human-readable, plain-text name for the object.")
|
||||
(name-map :initarg :name-map
|
||||
:accessor object-name-map
|
||||
:documentation "A language map of human-readable, plain-text names for the object.")
|
||||
(end-time :initarg :end-time
|
||||
:accessor object-end-time
|
||||
:documentation "The date and time describing the actual or expected ending time of the object.")
|
||||
(generator :initarg :generator
|
||||
:accessor object-generator
|
||||
:documentation "Identifies the entity that generated the object.")
|
||||
(icon :initarg :icon
|
||||
:accessor object-icon
|
||||
:documentation "Indicates an entity that describes an icon for this object.")
|
||||
(image :initarg :image
|
||||
:accessor object-image
|
||||
:documentation "Indicates an entity that describes an image for this object.")
|
||||
(in-reply-to :initarg :in-reply-to
|
||||
:accessor object-in-reply-to
|
||||
:documentation "Indicates one or more entities for which this object is considered a response.")
|
||||
(location :initarg :location
|
||||
:accessor object-location
|
||||
:documentation "Indicates one or more physical or logical locations associated with the object.")
|
||||
(preview :initarg :preview
|
||||
:accessor object-preview
|
||||
:documentation "Identifies an entity that provides a preview of this object.")
|
||||
(published :initarg :published
|
||||
:accessor object-published
|
||||
:documentation "The date and time at which the object was published.")
|
||||
(replies :initarg :replies
|
||||
:accessor object-replies
|
||||
:documentation "Identifies a Collection containing objects considered to be responses to this object.")
|
||||
(start-time :initarg :start-time
|
||||
:accessor object-start-time
|
||||
:documentation "The date and time describing the actual or expected starting time of the object.")
|
||||
(summary :initarg :summary
|
||||
:accessor object-summary
|
||||
:documentation "A natural language summarization of the object encoded as HTML.")
|
||||
(summary-map :initarg :summary-map
|
||||
:accessor object-summary-map
|
||||
:documentation "A language map of natural language summarizations of the object encoded as HTML.")
|
||||
(tag :initarg :tag
|
||||
:accessor object-tag
|
||||
:documentation "One or more \"tags\" that have been associated with an objects. A tag can be any kind of Object.")
|
||||
(updated :initarg :updated
|
||||
:accessor object-updated
|
||||
:documentation "The date and time at which the object was updated.")
|
||||
(url :initarg :url
|
||||
:accessor object-url
|
||||
:documentation "Identifies one or more links to representations of the object.")
|
||||
(to :initarg :to
|
||||
:accessor object-to
|
||||
:documentation "Identifies an entity considered to be part of the public primary audience of an Object.")
|
||||
(bto :initarg :bto
|
||||
:accessor object-bto
|
||||
:documentation "Identifies an Object that is part of the private primary audience of this Object.")
|
||||
(cc :initarg :cc
|
||||
:accessor object-cc
|
||||
:documentation "Identifies an Object that is part of the public secondary audience of this Object.")
|
||||
(bcc :initarg :bcc
|
||||
:accessor object-bcc
|
||||
:documentation "Identifies one or more Objects that are part of the private secondary audience of this Object.")
|
||||
(media-type :initarg :media-type
|
||||
:accessor object-media-type
|
||||
:documentation "When used on a Link, identifies the MIME media type of the referenced resource.")
|
||||
(duration :initarg :duration
|
||||
:accessor object-duration
|
||||
:documentation "When the object describes a time-bound resource, such as an audio or video, a meeting, etc, the duration property indicates the object's approximate duration.")))
|
||||
|
||||
(defgeneric to-plist (object)
|
||||
(:documentation "Serialize an object to a plist. This function is independent from any JSON library, allowing serialization to a plist which can then be used to create a JSON string with any desired library."))
|
||||
|
||||
(defmethod to-plist ((obj object))
|
||||
(loop :for slot :in (sb-mop:class-slots (class-of obj))
|
||||
:for slot-name = (sb-mop:slot-definition-name slot)
|
||||
:when (slot-boundp obj slot-name)
|
||||
append (list (intern (symbol-name slot-name) "KEYWORD")
|
||||
(let ((value (slot-value obj slot-name)))
|
||||
(if (typep value 'object)
|
||||
(to-plist value)
|
||||
value)))))
|
Loading…
Add table
Reference in a new issue