(if class
;; If we've got a class override, define a type matching the Lisp name
;; of this message so that typep and subtypep work
- (unless (eq name class)
+ (unless (or (eq name class) (find-class name nil))
(collect-form `(deftype ,name () ',class)))
;; If no class override, define the class now
(collect-form `(defclass ,name () (,@slots))))
(defmethod find-message-for-class ((protobuf protobuf) (class symbol))
(or (find class (proto-messages protobuf) :key #'proto-class)
+ (find class (proto-messages protobuf) :key #'proto-class-override)
(some #'(lambda (msg) (find-message-for-class msg class)) (proto-messages protobuf))))
(defmethod find-message-for-class ((protobuf protobuf) (class class))
(defmethod find-enum-for-type ((protobuf protobuf) type)
(or (find type (proto-enums protobuf) :key #'proto-class)
+ (find type (proto-enums protobuf) :key #'proto-class-override)
(some #'(lambda (msg) (find-enum-for-type msg type)) (proto-messages protobuf))))
(defmethod find-enum-for-type ((protobuf protobuf) (type string))
(defmethod print-object ((e protobuf-enum) stream)
(print-unprintable-object (e stream :type t :identity t)
(format stream "~A~@[ (~S)~]"
- (proto-name e) (proto-class e))))
+ (proto-name e) (or (proto-class-override e) (proto-class e))))
;; A protobuf value within an enumeration
(defmethod print-object ((m protobuf-message) stream)
(print-unprintable-object (m stream :type t :identity t)
(format stream "~A~@[ (~S)~]"
- (proto-name m) (proto-class m))))
+ (proto-name m) (or (proto-class-override e) (proto-class e)))))
(defmethod find-message-for-class ((message protobuf-message) (class symbol))
- (find class (proto-messages message) :key #'proto-class))
+ (or (find class (proto-messages message) :key #'proto-class)
+ (find class (proto-messages message) :key #'proto-class-override)))
(defmethod find-message-for-class ((message protobuf-message) (class class))
(find-message-for-class message (class-name class)))
(find class (proto-messages message) :key #'proto-name :test #'string=))
(defmethod find-enum-for-type ((message protobuf-message) type)
- (find type (proto-enums message) :key #'proto-class))
+ (or (find type (proto-enums message) :key #'proto-class)
+ (find type (proto-enums message) :key #'proto-class-override)))
(defmethod find-enum-for-type ((message protobuf-message) (type string))
(find type (proto-enums message) :key #'proto-name :test #'string=))
;; A protobuf field within a message
+;;--- Support the 'deprecated' option (should serialization ignore such fields?)
(defclass protobuf-field (base-protobuf)
((type :type string ;the name of the Protobuf type for the field
:accessor proto-type