1
0
Fork 0

- added some scaffolding for RPC;

- added 'read-delimited-into-array'.
This commit is contained in:
cage 2022-12-23 13:23:08 +01:00
parent d937235d6c
commit db30d2b47d
5 changed files with 110 additions and 0 deletions

View File

@ -0,0 +1,13 @@
(in-package :json-rpc-communication)
(defparameter *server-input-stream* *standard-input*)
(defparameter *server-output-stream* *standard-output*)
(defparameter *client-input-stream* *standard-input*)
(defparameter *client-output-stream* *standard-output*)
(defun start-server ())
(defun read-json ())

View File

@ -482,6 +482,48 @@ to the array"
(setf raw (reverse rev))))
(misc:list->array raw '(unsigned-byte 8))))))
(define-condition delimiter-not-found (error)
((delimiter
:initarg :delimiter
:reader delimiter))
(:report (lambda (condition stream)
(format stream "delimiter ~s not found and stream closed" (delimiter condition))))
(:documentation "Condition signalled when a command the user inputed
was not found in keybindings tree."))
(defparameter *read-delimiter* 0)
(defun read-delimited-into-array (stream &key
(delimiter *read-delimiter*)
(buffer-size 2048)
(buffer (make-fresh-array buffer-size
0
'(unsigned-byte 8)
t))
(accum (make-fresh-array 0
0
'(unsigned-byte 8))))
(flet ((delimiter-position ()
(position delimiter accum :test #'=)))
(let ((read-so-far (read-sequence buffer stream)))
(setf accum (concatenate 'vector accum (subseq buffer 0 read-so-far)))
(if (< read-so-far buffer-size)
(if (or (< (length accum) 1)
(not (delimiter-position)))
(error 'delimiter-not-found :delimiter delimiter)
(values (subseq accum 0 (1- (length accum)))
#()))
(if (delimiter-position)
(let* ((delimiter-position (delimiter-position))
(excess (subseq accum (1+ delimiter-position))))
(values (subseq accum 0 delimiter-position)
excess))
(read-delimited-into-array stream
:delimiter delimiter
:buffer-size buffer-size
:buffer buffer
:accum accum))))))
;; sequence utils
(defun safe-elt (sequence index)

View File

@ -185,6 +185,9 @@
:read-array
:read-all
:read-line-into-array
:delimiter-not-found
:*read-delimiter*
:read-delimited-into-array
:definline
:+cache-invalid-value+
:defcached
@ -3041,6 +3044,20 @@
(:shadowing-import-from :misc :random-elt :shuffle)
(:export))
(defpackage :json-rpc-communication
(:use
:cl
:config
:constants
:text-utils
:misc-utils)
(:local-nicknames (:re :cl-ppcre-unicode)
(:a :alexandria)
(:rpc :json-rpc2))
(:export))
(defpackage :main
(:use
:cl

View File

@ -23,3 +23,38 @@
(assert-true
(let ((bag (loop repeat 1000 collect (num:lcg-next-upto 1000))))
(null (set-difference bag (shuffle bag))))))
(defun read-delimited-excess (&optional (data '(1 2 3 4 5 6 0 7 8)))
(flexi-streams:with-input-from-sequence (stream data)
(read-delimited-into-array stream :buffer-size 3)))
(defun read-delimited-aligned-to-buffer (&optional (data '(1 2 3 4 5 0 7 8)))
(flexi-streams:with-input-from-sequence (stream data)
(read-delimited-into-array stream :buffer-size 3)))
(defun read-delimited-no-excess (&optional (data '(1 2 3 4 5 6 0)))
(flexi-streams:with-input-from-sequence (stream data)
(read-delimited-into-array stream :buffer-size 3)))
(defun read-delimited-error (&optional (data '(1 2 3 4 5 6 7)))
(flexi-streams:with-input-from-sequence (stream data)
(read-delimited-into-array stream :buffer-size 3)))
(deftest test-read-delimited-excess (misc-suite)
(assert-equalp (values #(1 2 3 4 5 6)
#(7 8))
(read-delimited-excess)))
(deftest test-read-delimited-aligned-to-buffer (misc-suite)
(assert-equalp (values #(1 2 3 4 5)
#())
(read-delimited-aligned-to-buffer)))
(deftest test-read-delimited-no-excess (misc-suite)
(assert-equalp (values #(1 2 3 4 5 6)
#())
(read-delimited-no-excess)))
(deftest test-read-delimited-no-excess (misc-suite)
(assert-condition delimiter-not-found
(read-delimited-error)))

View File

@ -27,6 +27,7 @@
:tooter
:croatoan
:osicat
:flexi-streams
:cl-spark
:access
:sqlite
@ -145,6 +146,8 @@
(:file "scheduled-events")
(:file "modules")
(:file "json-rpc2")
(:module gui
:components ((:file "json-rpc-communication")))
(:file "main")
(:module tests
:components ((:file "package")