Browse Source

Simplify the parsing of an OCapN address

fix-gitlab-ci
Jessica Tallon 3 years ago
parent
commit
4a5e2b197c
  1. 2
      goblins/ocapn/captp-test.rkt
  2. 26
      goblins/ocapn/structs-urls.rkt

2
goblins/ocapn/captp-test.rkt

@ -177,7 +177,7 @@
(define m2-location
(string->ocapn-machine "ocapn://m2.fake"))
(define m3-location
(string->ocapn-machine "ocapn://.m3.fake"))
(string->ocapn-machine "ocapn://m3.fake"))
(define m1-fakenet
(m1-run (spawn ^fake-netlayer "m1" network m1-incoming)))

26
goblins/ocapn/structs-urls.rkt

@ -18,6 +18,7 @@
"../utils/url-base64.rkt"
"define-recordable-struct.rkt"
racket/string
racket/list
racket/match
racket/contract
syrup)
@ -171,28 +172,17 @@
(define (error-not-an-ocapn-url something-else)
(error 'not-an-ocapn-url "Not an OCapN URL: ~a" something-else))
(define (string-rsplit-once str find-char)
(define (list-rsplit-once lst elem-to-find match-func)
(for/fold ([left-side '()]
[right-side '()])
([elem lst])
(if (match-func elem elem-to-find)
(values (append left-side
(if (null? left-side) '() (list elem))
right-side)
'())
(values left-side (append right-side (list elem))))))
(let*-values ([(chars) (string->list str)]
[(left-side right-side) (list-rsplit-once chars find-char char=?)])
(values (list->string left-side)
(list->string right-side))))
(define (url-host->transport-parts url-host)
(let* ((url-host-length (string-length url-host))
(transport-str (last (string-split url-host ".")))
(address (substring url-host 0 (- url-host-length (string-length transport-str) 1))))
(values (string->symbol transport-str) address)))
(define/contract (url->ocapn-machine ocapn-url)
(-> url? ocapn-machine?)
(let*-values ([(host) (url-host ocapn-url)]
[(address transport) (string-rsplit-once host #\.)])
(ocapn-machine (string->symbol transport) address #f)))
[(transport address) (url-host->transport-parts host)])
(ocapn-machine transport address #f)))
(define (url->ocapn-struct ocapn-url)
(unless (and (string? (url-scheme ocapn-url))

Loading…
Cancel
Save