Rewrote the code for more structured

This commit is contained in:
Nikolay Puzanov 2014-05-16 19:14:06 +04:00
parent 6b6430b72d
commit 3b81dfe90c

View File

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