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))
|