Rewrote the code for more structured
This commit is contained in:
parent
6b6430b72d
commit
3b81dfe90c
135
worktimer.scm
135
worktimer.scm
@ -270,68 +270,66 @@
|
|||||||
(time-difference->h:m:s (cadr tree)))
|
(time-difference->h:m:s (cadr tree)))
|
||||||
(for-each (lambda (l) (walk l (+ level 2))) (cddr tree)))))
|
(for-each (lambda (l) (walk l (+ level 2))) (cddr tree)))))
|
||||||
|
|
||||||
;;; Main function
|
;;; Returns last record of the sheet or #f if sheet is empty.
|
||||||
(define (main cmdl)
|
(define (last-task sheet)
|
||||||
(let ((command (cdr cmdl))
|
(let ((last (last-pair sheet)))
|
||||||
(sheet (read-timesheet ts-file))
|
(if (null? last) #f (car last))))
|
||||||
(now (current-date)))
|
|
||||||
(let* ((last (last-pair sheet))
|
;;; Stop task. Returns #t if stopped, #f if no running task.
|
||||||
(last (if (null? last) #f (car last))))
|
(define (stop-task task)
|
||||||
(if (null? command)
|
(if (not (caddr task))
|
||||||
;; Show report and running task
|
(let ((now (current-date)))
|
||||||
(if (and last (not (caddr last)))
|
(set-car! (cddr task) now)
|
||||||
(format #t "~a: ~a\n"
|
(set-car! (cdddr task) (date-difference now (cadr task)))
|
||||||
(path->string (car last))
|
#t)
|
||||||
(time-difference->h:m:s
|
#f))
|
||||||
(date-difference now (cadr last))))
|
|
||||||
(format #t "NO TASKS\n"))
|
;;; Start new task and append its to the sheet.
|
||||||
;; Run command
|
;;; Returns new sheet and new task.
|
||||||
(let ((param (cdr command))
|
(define (new-task sheet path)
|
||||||
(command (car command)))
|
(let ((task (list path (current-date) #f #f)))
|
||||||
(let ((new-sheet
|
(values (append sheet (list task)) task)))
|
||||||
(cond
|
|
||||||
;; ----------------------- Start timer ------------------------- ;;
|
;;; ================================ COMMANDS ==================================
|
||||||
((string= command "start")
|
|
||||||
(let ((path (if (null? param)
|
;;; Start new task. Returns new sheet with started task or #f if nothing started.
|
||||||
|
(define (cmd-start-task sheet . params)
|
||||||
|
(let* ((last (last-task sheet))
|
||||||
|
(path (if (null? params)
|
||||||
(if last (car last) #f)
|
(if last (car last) #f)
|
||||||
(path-split (car param)))))
|
(path-split (car params))))
|
||||||
|
(now (current-date)))
|
||||||
(if (not path)
|
(if (not path)
|
||||||
(begin
|
(begin (format
|
||||||
(format
|
|
||||||
(current-error-port)
|
(current-error-port)
|
||||||
"Not specified task path. No tasks in the sheet.\n")
|
"Not specified task path. No tasks in the sheet.\n")
|
||||||
sheet)
|
#f)
|
||||||
(begin
|
(begin
|
||||||
(when (and last (not (caddr last)))
|
(stop-task last)
|
||||||
;; Stop last path if running
|
(let-values (((sheet task) (new-task sheet path)))
|
||||||
(set-car! (cddr last) now)
|
|
||||||
(set-car! (cdddr last) (date-difference now (cadr last))))
|
|
||||||
;; Add new task
|
|
||||||
(let ((new-task (list path now #f #f)))
|
|
||||||
(format #t "--- NEW TASK RUN\n")
|
(format #t "--- NEW TASK RUN\n")
|
||||||
(print-task new-task)
|
(print-task task)
|
||||||
(append sheet (list new-task)))))))
|
sheet)))))
|
||||||
;; ----------------------- Stop timer ------------------------- ;;
|
|
||||||
((string= command "stop")
|
;;; Stop a running task. Returns new sheet or #f if nothing to stop.
|
||||||
;; Stop last path if running
|
(define (cmd-stop-task sheet . params)
|
||||||
(if (and last (not (caddr last)))
|
(let ((last (last-task sheet)))
|
||||||
|
(if (stop-task last)
|
||||||
(begin
|
(begin
|
||||||
(set-car! (cddr last) now)
|
|
||||||
(set-car! (cdddr last) (date-difference now (cadr last)))
|
|
||||||
(format #t "--- STOP TASK\n")
|
(format #t "--- STOP TASK\n")
|
||||||
(print-task last))
|
(print-task last)
|
||||||
(format
|
|
||||||
(current-error-port)
|
|
||||||
"Noting to stop, no runnig task\n"))
|
|
||||||
sheet)
|
sheet)
|
||||||
;; ----------------------- Show report ------------------------- ;;
|
(begin
|
||||||
((string= command "report")
|
(format (current-error-port) "Nothing to stop\n")
|
||||||
|
#f))))
|
||||||
|
|
||||||
|
(define (cmd-report sheet . params)
|
||||||
(format #t "--- REPORT")
|
(format #t "--- REPORT")
|
||||||
(let ((sheet
|
(let ((sheet
|
||||||
(if (null? param) sheet
|
(if (null? params) sheet
|
||||||
(let* ((interval (car param))
|
(let* ((interval (car params))
|
||||||
(report-date (catch #t
|
(report-date (catch #t
|
||||||
(lambda () (string->date (cadr param) date-format))
|
(lambda () (string->date (cadr params) date-format))
|
||||||
(lambda (key . args) (current-date)))))
|
(lambda (key . args) (current-date)))))
|
||||||
(filter (cond
|
(filter (cond
|
||||||
;; Filter records by day
|
;; Filter records by day
|
||||||
@ -370,13 +368,38 @@
|
|||||||
(newline)
|
(newline)
|
||||||
(print-report
|
(print-report
|
||||||
(make-report sheet)))
|
(make-report sheet)))
|
||||||
(let* ((last (last-pair sheet))
|
(let ((last (last-task sheet)))
|
||||||
(last (if (null? last) #f (car last))))
|
|
||||||
(when last
|
(when last
|
||||||
(format #t "\n--- ~a TASK\n"
|
(format #t "\n--- ~a TASK\n"
|
||||||
(if (caddr last) "LAST STOPPED" "RUNNING"))
|
(if (caddr last) "LAST STOPPED" "RUNNING"))
|
||||||
(print-task last now)))
|
(print-task last (current-date))))
|
||||||
#f)
|
#f)
|
||||||
|
|
||||||
|
;;; ================================ MAIN FUNCTION ==================================
|
||||||
|
(define (main cmdl)
|
||||||
|
(let ((command (cdr cmdl))
|
||||||
|
(sheet (read-timesheet ts-file)))
|
||||||
|
(if (null? command)
|
||||||
|
|
||||||
|
;; Show running task
|
||||||
|
(let ((last (last-task sheet)))
|
||||||
|
(if (and last (not (caddr last)))
|
||||||
|
(format #t "~a: ~a\n"
|
||||||
|
(path->string (car last))
|
||||||
|
(time-difference->h:m:s
|
||||||
|
(date-difference (current-date) (cadr last))))
|
||||||
|
(format #t "NO TASKS\n")))
|
||||||
|
|
||||||
|
;; Else run command
|
||||||
|
(let ((param (cdr command))
|
||||||
|
(command (car command)))
|
||||||
|
(let ((new-sheet
|
||||||
|
(apply (cond
|
||||||
|
((string= command "start") cmd-start-task)
|
||||||
|
((string= command "stop") cmd-stop-task)
|
||||||
|
((string= command "report") cmd-report)
|
||||||
|
((string= command "refresh") (lambda (s . p) s))
|
||||||
|
|
||||||
;; ----------------------- Show usage ------------------------- ;;
|
;; ----------------------- Show usage ------------------------- ;;
|
||||||
(else
|
(else
|
||||||
(with-output-to-port (current-error-port)
|
(with-output-to-port (current-error-port)
|
||||||
@ -390,9 +413,11 @@
|
|||||||
(format #t " report week [DATE] Show report for current week or week of DATE\n")
|
(format #t " report week [DATE] Show report for current week or week of DATE\n")
|
||||||
(format #t " report month [DATE] Show report for current month or month of DATE\n")
|
(format #t " report month [DATE] Show report for current month or month of DATE\n")
|
||||||
(format #t " report PATH Show report for project\n")
|
(format #t " report PATH Show report for project\n")
|
||||||
|
(format #t " refresh Refresh worksheet file after manual edit\n")
|
||||||
(format #t " Show running task and timer\n")
|
(format #t " Show running task and timer\n")
|
||||||
(newline)))
|
(newline)))
|
||||||
#f))))
|
(lambda (s . p) #f)))
|
||||||
|
(cons sheet param))))
|
||||||
|
|
||||||
;; ----------------------- Save new sheet ------------------------- ;;
|
;; ----------------------- Save new sheet ------------------------- ;;
|
||||||
(when (and
|
(when (and
|
||||||
@ -400,7 +425,7 @@
|
|||||||
(not (null? new-sheet)))
|
(not (null? new-sheet)))
|
||||||
(with-output-to-file ts-file
|
(with-output-to-file ts-file
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(print-timesheet new-sheet))))))))))
|
(print-timesheet new-sheet)))))))))
|
||||||
|
|
||||||
;;; JUST DO IT!
|
;;; JUST DO IT!
|
||||||
(main (command-line))
|
(main (command-line))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user