#lang racket/base (require racket/file racket/list racket/path racket/string) (provide bool-value int-value string-value split-addresses relpath-string flac-path? ensure-parent-directory! alist-ref/default alist-set) (define (bool-value v [default #f]) (cond [(boolean? v) v] [(number? v) (not (zero? v))] [(string? v) (define s (string-downcase (string-trim v))) (cond [(member s '("#t" "true" "yes" "y" "1" "on")) #t] [(member s '("#f" "false" "no" "n" "0" "off" "")) #f] [else default])] [else default])) (define (int-value v [default 0]) (cond [(integer? v) v] [(number? v) (inexact->exact (round v))] [(string? v) (or (string->number (string-trim v)) default)] [else default])) (define (string-value v [default ""]) (cond [(string? v) v] [(symbol? v) (symbol->string v)] [(number? v) (number->string v)] [(boolean? v) (if v "#t" "#f")] [(not v) default] [else (format "~a" v)])) (define (split-addresses v) (define s (string-value v "")) (filter (lambda (x) (not (string=? x ""))) (map string-trim (regexp-split #px"[,;]" s)))) (define (relpath-string base p) (path->string (find-relative-path (simple-form-path base) (simple-form-path p)))) (define (flac-path? p) (and (file-exists? p) (let-values ([(base name dir?) (split-path p)]) (and (path? name) (string-ci=? (bytes->string/utf-8 (or (path-get-extension name) #"")) ".flac"))))) (define (ensure-parent-directory! p) (define-values (base name dir?) (split-path p)) (when (path? base) (make-directory* base))) (define (alist-ref/default a k [default #f]) (define e (assoc k a)) (if e (cdr e) default)) (define (alist-set a k v) (cons (cons k v) (filter (lambda (e) (not (equal? (car e) k))) a)))