changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/lib/dat/proto.lisp

changeset 275: 78ef6145e272
parent: 11ef863e0ac0
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 12 Apr 2024 18:41:40 -0400
permissions: -rw-r--r--
description: return of the uri
1 ;;; lib/dat/proto.lisp --- data (de)serialization
2 
3 ;;
4 
5 ;;; Code:
6 (in-package :dat/proto)
7 
8 ;;; Errors
9 (define-condition dat-error (std-error) ())
10 
11 (define-condition serializer-error (dat-error) ())
12 (define-condition deserializer-error (dat-error) ())
13 (define-condition serde-error (dat-error) ())
14 ;;; Serialize
15 (eval-always
16 (defvar *serializable*
17  '(string simple-string octet-vector octet
18  char simple-array simple-vector array
19  vector)
20  "List of types which can be serialized to."))
21 
22 (deftype serializable-type-designator ()
23  `(or (member ,@*serializable*)
24  (cons (member ,@*serializable*) *)))
25 
26 (defun serializable-type-p (x)
27  "Return non-nil if type X is serializable."
28  (typep x 'serializable-type-designator))
29 
30 (defgeneric serializable-p (self)
31  (:method ((self t)) nil)
32  (:documentation "Return non-nil of object SELF is serializable."))
33 
34 (defgeneric serialize (obj format &key)
35  (:documentation "Serialize OBJ to FORMAT, which is a SERIALIZABLE-TYPE-DESIGNATOR."))
36 
37 ;;; Deserialize
38 (eval-always
39 (defvar *deserializable* nil
40  "List of types which are DESERIALIZABLE-P"))
41 
42 (deftype deserializable-type-designator ()
43  `(or (member ,@*deserializable*)
44  (cons (member ,@*deserializable*) *)))
45 
46 (defun deserializable-type-p (x)
47  "Return non-nil if type X is deserializable."
48  (typep x 'deserializable-type-designator))
49 
50 (defgeneric deserializable-p (self)
51  (:method ((self t)) nil)
52  (:documentation "Return non-nil if object SELF is deserializable."))
53 
54 (defgeneric deserialize (from format &key)
55  (:documentation "Deserialize FROM into an object of type FORMAT, which is a
56 DESERIALIZABLE-TYPE-DESIGNATOR."))
57 
58 ;;; Serde
59 (defgeneric serde (from to)
60  (:documentation "Point-to-point serialization.
61 
62 FROM and TO should both specialize on object instances.
63 
64 Calling this function requires you to initialize the arguments instead
65 of relying on a type-designator format and generating an object in the
66 method body."))
67