Coverage report: /development/source/library/org/datagraph/spocq-shard/src/spocq-server/streams/mqtt-url.lisp
| Kind | Covered | All | % |
| expression | 0 | 73 | 0.0 |
| branch | 0 | 4 | 0.0 |
Key
Not instrumented
Conditionalized out
Executed
Not executed
Both branches taken
One branch taken
Neither branch taken
1
;;; -*- Mode: lisp; Syntax: ansi-common-lisp; Base: 10; Package: org.datagraph.spocq.server.implementation; -*-
2
;;; (load #p"patches/model.lisp")
4
(in-package :org.datagraph.spocq)
6
(dsu:modpackage :org.datagraph.spocq
17
(defstruct (mqtt-url (:include iri (lexical-form "")))
25
(defparameter *mqtt-url-scanner*
26
(cl-ppcre:create-scanner `(:sequence :start-anchor
27
(:sequence (:register (:alternation "mqtt" "mqtts"))
35
(:greedy-repetition 0 1
37
(:greedy-repetition 1 nil (:inverted-char-class #\:))))
39
(:greedy-repetition 0 1
41
(:greedy-repetition 1 nil (:inverted-char-class #\@))))
44
(:greedy-repetition 1 nil (:inverted-char-class #\: #\/)))
45
(:greedy-repetition 0 1
48
(:greedy-repetition 1 nil (:inverted-char-class #\/)))))
49
(:greedy-repetition 0 1 "/"))))
51
"mqtt[s]://[username][:password]@host.domain[:port]")
53
(defun parse-mqtt-url (value)
54
(multiple-value-bind (whole strings)
55
(cl-ppcre:scan-to-strings *mqtt-url-scanner* value)
57
(values (loop for i from 0 for property in '(:scheme :user :password :authority :port)
58
for value = (aref strings i)
60
append (list property (case property
61
(:scheme (intern (string-upcase value) :keyword))
62
(:port (parse-integer value))
65
(error "Invalid mqtt uri lexical form: ~s" value))))
66
;;; (parse-mqtt-url "mqtt://test.dydra.com")
67
;;; (parse-mqtt-url "mqtt://test.dydra.com/")
68
;;; (parse-mqtt-url "mqtts://test.dydra.com")
69
;;; (parse-mqtt-url "mqtt://test.dydra.com:8883")
70
;;; (parse-mqtt-url "mqtt://u:p@test.dydra.com")
72
(defmethod ensure-iri-lexical-form ((uri mqtt-url))
73
(let ((value (mqtt-url-lexical-form uri)))
74
(if (plusp (length value))
76
(let ((scheme (mqtt-url-scheme uri))
77
(user (mqtt-url-user uri))
78
(password (mqtt-url-password uri))
79
(authority (mqtt-url-authority uri))
80
(port (mqtt-url-port uri)))
81
(setf (spocq::mqtt-url-lexical-form uri)
82
(format nil "~(~a~)://~:[~2*~;~@[~a~]:~@[~a~]@~]~@[~a~]~@[:~a~]"
85
user password authority port
88
(defgeneric spocq:mqtt-url (value)
89
(:method ((lexical-form cl:string))
90
(multiple-value-bind (initargs lexical-form) (spocq:parse-mqtt-url lexical-form)
91
(destructuring-bind (&key scheme (port (ecase scheme (:mqtt 1883) (:mqtts 8883)))
92
&allow-other-keys) initargs
93
(apply #'spocq:make-mqtt-url :lexical-form lexical-form
94
:scheme (if (eql port 8883) :mqtts scheme)
97
(:method ((url spocq:mqtt-url))
98
(ensure-iri-lexical-form url)))
100
(defmethod spocq.i::parse-uri-by-scheme ((type (eql :mqtt)) string)
101
(spocq:mqtt-url string))
103
(defmethod spocq.i::construct-uri-term ((scheme (eql :mqtt)) lexical-form)
104
(spocq:mqtt-url lexical-form))
105
;;; (spocq:mqtt-url "mqtt://test.dydra.com")