undone/undone/main.scm

124 lines
3.9 KiB
Scheme
Raw Normal View History

2012-08-13 01:16:04 +02:00
(define-module (undone main)
#:use-module (ice-9 format)
#:use-module (ice-9 rdelim)
#:export (main))
(define-syntax define-view
(lambda (x)
2012-08-14 22:53:43 +02:00
(syntax-case x (where)
((_ name doc fmt fields fields* ... where predicate)
2012-08-13 01:16:04 +02:00
(with-syntax ((viewname
(datum->syntax
x (symbol-append (syntax->datum #'name) '-view))))
2012-08-14 22:24:34 +02:00
#`(begin
2012-08-13 01:16:04 +02:00
(define (viewname)
doc
2012-08-14 22:24:34 +02:00
(map (lambda (item)
2012-08-14 22:40:40 +02:00
(let (#,@(map (lambda (field)
2012-08-14 22:53:43 +02:00
#`(#,field (cdr (assq (quote #,field) item))))
#'(fields fields* ...)))
(if predicate
(format #t fmt
#,@(map (lambda (field)
field)
#'(fields fields* ...))))))
2012-08-14 22:24:34 +02:00
todo-list))
2012-08-13 01:16:04 +02:00
(set! view-list
(append view-list
2012-08-14 22:53:43 +02:00
(list (cons 'name viewname)))))))
((_ name doc fmt fields fields* ...)
(with-syntax ((viewname
(datum->syntax
x (symbol-append (syntax->datum #'name) '-view))))
#'(define-view name doc fmt fields fields* ... where #t))))))
2012-08-13 01:16:04 +02:00
(define todo-list-file "todo.scm")
2012-08-14 21:23:46 +02:00
(define rc-file
(let* ((xdg (getenv "XDG_CONFIG_HOME"))
(home (getenv "HOME"))
(rc-file-name "undonerc.scm")
2012-08-14 21:27:24 +02:00
(xdg-rc-file (string-append xdg "/undone/" rc-file-name))
(home-rc-file (string-append home "/.undone/" rc-file-name)))
2012-08-14 21:23:46 +02:00
(if (and xdg (file-exists? xdg-rc-file))
xdg-rc-file
home-rc-file)))
2012-08-13 01:16:04 +02:00
(define todo-list
(if (file-exists? todo-list-file)
(let* ((port (open-input-file todo-list-file))
(result (read port)))
(close-port port)
result)
'()))
(define view-list '())
(define (data-dir)
"Get the location for data files."
(let ((xdg (getenv "XDG_DATA_HOME")))
(string-append (if xdg
(string-append xdg "/")
(string-append (getenv "HOME") "/."))
"undone")))
(define (config-dir)
"Get the location for configuration files."
(let ((xdg (getenv "XDG_CONFIG_HOME")))
(string-append (if xdg
(string-append xdg "/")
(string-append (getenv "HOME") "/."))
"undone")))
(define (save)
"Save the list."
(let ((port (open-output-file todo-list-file)))
(write todo-list port)
(close-port port)))
(define (add args)
"Add item to the list."
(set! todo-list
(append todo-list
(list
(append
`((content . ,(read-delimited "")))
(map (lambda (arg)
(let ((pair (string-split arg #\=)))
(cons (string->symbol (car pair))
(cadr pair))))
args))))))
(define-view default
"Default todo-list view, show only the title."
2012-08-14 22:24:34 +02:00
"~a" content)
2012-08-13 01:16:04 +02:00
(define (view args)
"Show a list of todo items."
(let* ((view-name (or (and (pair? args) (car args))
"default"))
(view-symbol (string->symbol view-name))
(view-cons (assq view-symbol view-list))
(view-func (if view-cons (cdr view-cons) '())))
(if (procedure? view-func)
(apply view-func '()))))
(define (main args)
2012-08-14 21:23:46 +02:00
(load rc-file)
2012-08-13 01:16:04 +02:00
(if (> (length args) 1)
(case (string->symbol (cadr args))
((add)
(add (list-tail args 2))
(save))
((view)
(view (list-tail args 2)))
((views)
(display "Defined views:")
(newline)
(map (lambda (view)
(format #t "~a~20t~a~%"
(car view) (procedure-documentation (cdr view))))
view-list)))))
(main (program-arguments))