; - d | download
; - u | upload
; - calls user-configured command to upload user's own feed file to their server
+;
+; Looks like a better CLI parser than "racket/cmdline":
+; https://docs.racket-lang.org/natural-cli/
#lang racket
(require http-client)
(require rfc3339-old)
+(module+ test
+ (require rackunit))
+
(struct msg (ts_epoch ts_rfc3339 nick uri text))
(struct feed (nick uri))
(define (concurrent-filter-map num_workers f xs)
+ ; TODO preserve order of elements OR communicate that reorder is expected
; TODO switch from mailboxes to channels
(define (make-worker id f)
(define parent (current-thread))
(for-each thread-wait threads)
results)
+(module+ test
+ (define n-workers 10)
+ (define given (list
+ (λ (x) (if (even? x) x #f))
+ (range 11)))
+ (check-equal?
+ (sort (apply concurrent-filter-map (cons n-workers given)) <)
+ (sort (apply filter-map given ) <)))
+
(define (msg-print out-format odd msg)
(printf
(match out-format
"https://raw.githubusercontent.com/mdom/we-are-twtxt/master/we-are-twtxt.txt")
(str->feeds (uri-fetch uri)))
-(define user-agent
+(define (user-agent prog-name prog-version)
(let*
- ([prog-name "tt"]
- [prog-version "0.3.4"]
- [prog-uri "https://github.com/xandkar/tt"]
+ ([prog-uri "https://github.com/xandkar/tt"]
[user-feed-file (expand-user-path "~/twtxt-me.txt")]
[user
(if (file-exists? user-feed-file)
(format "~a/~a (~a)" prog-name prog-version user)))
(module+ main
- (define (setup-logging)
- (define logger (make-logger #f #f 'debug #f))
- (define log-chan (make-log-receiver logger 'debug))
+ (require setup/getinfo)
+
+ (let* ([logger (make-logger #f #f 'debug #f)]
+ [log-receiver (make-log-receiver logger 'debug)])
(void (thread (λ ()
[date-display-format 'iso-8601]
[let loop ()
- (define data (sync log-chan))
+ (define data (sync log-receiver))
(define level (vector-ref data 0))
(define msg (vector-ref data 1))
(define ts (date->string (current-date) #t))
(eprintf "~a [~a] ~a~n" ts level msg)
(loop)])))
(current-logger logger))
-
- (setup-logging)
(current-http-response-auto #f)
- (current-http-user-agent user-agent)
+ (let* ([prog-name "tt"]
+ [prog-version ((get-info (list prog-name)) 'version)]
+ [user-agent (user-agent prog-name prog-version)])
+ (current-http-user-agent user-agent))
(date-display-format 'rfc2822)
-
- (define args (current-command-line-arguments))
- (define feeds
- (if (vector-empty? args)
- (we-are-twtxt)
- (file->feeds (vector-ref args 0))))
- (define out-format 'multi-line)
- (define num_workers 15) ; 15 was fastest out of the tried 1, 5, 10, 15 and 20.
- (timeline-print out-format (timeline num_workers feeds)))
+ (let ([feeds
+ (let ([args (current-command-line-arguments)])
+ (if (= 0 (vector-length args))
+ (we-are-twtxt)
+ (file->feeds (vector-ref args 0))))]
+ [out-format
+ 'multi-line]
+ [num_workers
+ 15]) ; 15 was fastest out of the tried 1, 5, 10, 15 and 20.
+ (timeline-print out-format (timeline num_workers feeds))))