@@ 53,35 53,17 @@
(let loop ([wait 0])
(sleep wait)
(with-handlers ([exn:fail:network:http:error?
- (λ (exn)
+ (λ (ex)
(break-enabled #t)
(display ".")
(flush-output)
(loop 3))])
f)))
-(module+ main
- (define point (gen))
-
- (define bulletin
- (update-port (update-host json-requester "localhost") 1984))
-
- (define token
- (let ([username (readline "Username: ")]
- [password (get-pass "Password: ")])
- (with-handlers ([exn:fail:network:http:error?
- (λ ([ex : exn:fail:network:http:error])
- (newline)
- (displayln (format "Login refused: ~a"
- (exn-message ex)))
- (exit))])
- (json-response-body
- (post bulletin "/register"
- #:data
- (jsexpr->string (hasheq 'input (integer->hex-string point)
- 'username username
- 'password password)))))))
-
+(define (vote-in-election
+ [point : Integer]
+ [bulletin : requester]
+ [token : JSExpr])
(displayln "retrieving candidates...")
(define candidates (cast (json-response-body
(retry-request (get bulletin "/candidates")))
@@ 308,3 290,37 @@
[rank rankings])
(for ([r rank])
(displayln (format "~a) ~a" i (list-ref candidates r))))))
+
+(module+ main
+ (define point (gen))
+
+ (define bulletin
+ (update-port (update-host json-requester "localhost") 1984))
+
+ (define token
+ (let ([username (readline "Username: ")]
+ [password (get-pass "Password: ")])
+ (with-handlers ([exn:fail:network:http:error?
+ (λ ([ex : exn:fail:network:http:error])
+ (newline)
+ (displayln (format "Login refused: ~a"
+ (exn-message ex)))
+ (exit))])
+ (json-response-body
+ (post bulletin "/register"
+ #:data
+ (jsexpr->string (hasheq 'input (integer->hex-string point)
+ 'username username
+ 'password password)))))))
+
+ ; the bulletin can have multiple elections
+ (let loop ()
+ (with-handlers ([exn:fail?
+ (λ ([ex : exn:fail])
+ (displayln (exn-message ex))
+ (displayln
+ "Assuming election was cancelled; starting over")
+ (break-enabled #t)
+ (loop))])
+ (vote-in-election point bulletin token))
+ (loop)))