capybara/util.rkt

39 lines
1.0 KiB
Racket
Raw Normal View History

2021-06-07 03:16:08 +00:00
#lang racket/base
2021-06-11 08:54:03 +00:00
(require racket/date racket/format racket/string racket/port)
2021-06-07 03:16:08 +00:00
2021-06-11 08:54:03 +00:00
(provide ~r/pad run-external get-date-ymd)
(define (get-date-ymd)
(define date (current-date))
(list (date-year date) (date-month date) (date-day date)))
2021-06-08 07:14:44 +00:00
(define (~r/pad num pad-to)
(~r num #:min-width pad-to #:pad-string "0"))
2021-06-07 03:16:08 +00:00
(define (run-external argv source)
2021-06-08 07:14:44 +00:00
(printf "running external program: ~a\n" argv)
2021-06-07 03:16:08 +00:00
(define-values [proc out in err]
(apply subprocess #f #f #f "/usr/bin/env" argv))
(define out-str #f)
(define err-str "")
(define out-reader (thread (λ () (set! out-str (port->string out)))))
(define err-reader (thread (λ () (set! err-str (port->string err)))))
(write-string source in)
(flush-output in)
(close-output-port in)
(subprocess-wait proc)
(thread-wait out-reader)
(thread-wait err-reader)
(define err-trimmed (string-trim err-str))
(unless (string=? "" err-trimmed)
(error "child process raised error!" err-trimmed))
(unless out-str
(error "child process didn't return anything!"))
out-str)