#!/usr/bin/env gosh (use text.edn) (use file.util) (use scheme.mapping.hash) (use gauche.parseopt) (define (show-help progname) (display (format "~a: tracktrain's onboard config-and-state manager. Usage: ~a [options] key [value] This is a very simple key-value store. Give both to set, give just the key to look something up Options: -s --statefile: state file -d --delete: explicitly delete an entry -h --help: display this help " progname progname)) (exit 0)) (define (main args) (let-args (cdr args) ((statefile "s|state=s") (delete "d|delete") (help "h|help" => (cut show-help (car args))) . restargs) (define file (if (equal? statefile #f) "./obu-state.edn" statefile)) (if (or delete (= (length restargs) 2)) (set file (list-ref restargs 0) (if delete #f (list-ref restargs 1)) delete) (display (get file (list-ref restargs 0)))) (exit 0))) (define (set file key value delete) (define data (if (file-exists? file) (call-with-input-file file parse-edn) (edn-map))) (define data2 (if delete (hashmap-delete data (string->symbol key)) (hashmap-set data (string->symbol key) value))) (call-with-output-file file (cut construct-edn data2 <>))) (define (get file key) (if (file-exists? file) (guard (e [else #f]) (hashmap-ref (call-with-input-file file parse-edn) (string->symbol key))) #f))