#!/usr/bin/guile \ --listen -s !# (add-to-load-path "/home/titan/dev/dotfiles/lib/guile/") (use-modules (ice-9 format) (ice-9 ftw) (ice-9 popen) (ice-9 rdelim) (json) (term ansi-color) (utils) (web request) (web response) (web server) (web uri)) (define habits-dir (expand-file "~/org/habits/")) (define (iter-lines filename proc) (call-with-input-file filename (lambda (port) (let loop ((values '()) (line (read-line port))) (if (eof-object? line) (reverse values) (loop (cons (proc line) values) (read-line port))))))) (define (cli-print file-name) (iter-lines (string-append habits-dir file-name) (lambda (line) (let ((row (map string->number (string-split line #\:)))) (format #t "~a -> ~d~%" (colorize-string (strftime "%c" (localtime (car row))) 'CYAN 'BOLD) (cadr row)) row)))) (define (request-path-components request) (split-and-decode-uri-path (uri-path (request-uri request)))) (define (not-found request) (values (build-response #:code 404) (string-append "Resource not found: " (uri->string (request-uri request))))) (define (handle-request request request-body) (and=> request-body display) (newline) (let ((path (request-path-components request)) ) (display path) (cond ((null? path) (values '((content-type . (application/json))) (scm->json-string (list->vector (scandir habits-dir))))) ((file-exists? (string-append habits-dir (car path))) (values '((content-type . (application/json))) (scm->json-string (list->vector (iter-lines (string-append habits-dir (car path)) (lambda (line) (list->vector (map string->number (string-split line #\:))))))))) ((string=? "hi" (car path)) (values '((content-type . (application/json))) '(hi))) (else (not-found request))))) (cli-print "pull-ups.dat") (display "pu\n") (cli-print "poop.dat") ;(run-server (lambda (request request-body) (handle-request request request-body)))