just the bones so far
This commit is contained in:
@@ -0,0 +1,322 @@
|
||||
// =============================================================================
|
||||
// Auth: Alex Celani
|
||||
// File: tdm.go
|
||||
// Revn: 10-10-2021 0.5
|
||||
//
|
||||
// Func: display and manage progress of a litany of items to be done,
|
||||
// with an organization scheme similar to Trello. It's CLI
|
||||
// Trello
|
||||
//
|
||||
// TODO: COMMENT
|
||||
// file out
|
||||
// fix data storage issue
|
||||
// contemplate adding XOR of data in file, altho who cares
|
||||
// contemplate adding battery of tests
|
||||
// contemplate moving functions to external file
|
||||
// side-by-side printing
|
||||
// colored printing?
|
||||
// keep track of finished items
|
||||
// periodic tasks? something to do with the time package
|
||||
// =============================================================================
|
||||
// CHANGE LOG
|
||||
// -----------------------------------------------------------------------------
|
||||
// 10-04-2021: init
|
||||
// wrote bones of string parsing into data structure
|
||||
// 10-05-2021: commented
|
||||
// 10-06-2021: entirely rewrote text format and text processor
|
||||
// 10-09-2021: added reading from file
|
||||
// wrote bones to while loop
|
||||
// created empty functions for commands
|
||||
// wrote, but did not test, getting user input
|
||||
//*10-10-2021: fixed user input
|
||||
// wrote help()
|
||||
// wrote second draft of show(), fix immediately
|
||||
//
|
||||
// =============================================================================
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt" // used for Println
|
||||
"strings" // used for Split
|
||||
"strconv" // used for Atoi
|
||||
"io/ioutil" // used for ReadFile
|
||||
"os" // used for Exit, Stdin
|
||||
"bufio" // used for NewScanner
|
||||
)
|
||||
|
||||
|
||||
// aliases for common functions
|
||||
var p = fmt.Print
|
||||
var print = fmt.Println
|
||||
var printf = fmt.Printf
|
||||
var split = strings.Split
|
||||
var lower = strings.ToLower
|
||||
var atoi = strconv.Atoi
|
||||
var exit = os.Exit
|
||||
var read = ioutil.ReadFile
|
||||
|
||||
|
||||
func input( ps1 string ) string {
|
||||
p( ps1 )
|
||||
scanner := bufio.NewScanner( os.Stdin )
|
||||
scanner.Scan()
|
||||
return scanner.Text()
|
||||
}
|
||||
|
||||
|
||||
|
||||
func choose( commands []string ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
func help( c string ) {
|
||||
var helpFlag bool = c == "all" || c == ""
|
||||
if helpFlag || c == "choose" {
|
||||
print( " choose <board>" )
|
||||
print( " \\-- switch focus to selected board" )
|
||||
} else if helpFlag || c == "make" {
|
||||
print( " make <board = b>" )
|
||||
print( " \\-- create new board, <b>" )
|
||||
print( " \\ <board> <task = t>" )
|
||||
print( " \\-- create new task <t> under board <board>" )
|
||||
print( " \\ <board> <task> <subtask = s>" )
|
||||
print( " \\-- create new subtask <s> under task <board.task>" )
|
||||
} else if helpFlag || c == "mark" {
|
||||
print( " mark <task> [<subtask>] <status = 100>" )
|
||||
print( " \\ \\-- status -> 0 - 100" )
|
||||
print( " \\-- set progress of <task> or <task.subtask> to <status>" )
|
||||
} else if helpFlag || c == "move" {
|
||||
print( " move <board1> <task> <board2>" )
|
||||
print( " \\-- change scope of <task> from <board1> to <board2>" )
|
||||
} else if helpFlag || c == "show" {
|
||||
print( " show [all|<board> [<task> [<subtask>]]]" )
|
||||
print( " \\-- display contents of <board>, <board.task>, or <board.task.subtask>" )
|
||||
print( " \\-- or, with [all] set, display everything" )
|
||||
} else if helpFlag || c == "exit" || c == "quit" {
|
||||
print( " exit" )
|
||||
print( " quit" )
|
||||
print( " \\-- exit program" )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func mark( commands []string ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
func move( commands []string ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
func show( commands []string ) {
|
||||
|
||||
//commands = append( commands, "all" )
|
||||
switch commands[0] {
|
||||
case "all":
|
||||
for b, c := range boards {
|
||||
print( b )
|
||||
for _, task := range c {
|
||||
printf( "%-20s", task.name )
|
||||
printf( "%20d\n", task.fill )
|
||||
for _, subt := range task.subt {
|
||||
printf( "%5" )
|
||||
printf( "%-15s", subt.name )
|
||||
printf( "%20d\n", subt.fill )
|
||||
}
|
||||
}
|
||||
}
|
||||
case "board":
|
||||
_, prs := boards[commands[1]]
|
||||
if prs {
|
||||
for _, task := range boards[commands[1]] {
|
||||
printf( "%-20s", task.name )
|
||||
printf( "%20d\n", task.fill )
|
||||
for _, subt := range task.subt {
|
||||
printf( "%5" )
|
||||
printf( "%-15s", subt.name )
|
||||
printf( "%20d\n", subt.fill )
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print( "board <", commands[1], "> does not exist" )
|
||||
}
|
||||
case "task":
|
||||
var tFlag bool = false
|
||||
// make sure commands[1] is in boards
|
||||
for _, c := range boards {
|
||||
for _, task := range c {
|
||||
if task.name == commands[1] {
|
||||
tFlag = true
|
||||
for _, subt := range task.subt {
|
||||
printf( "%5" )
|
||||
printf( "%-15s", subt.name )
|
||||
printf( "%20d\n", subt.fill )
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if !tFlag {
|
||||
print( "task <", commands[1], "> does not exist" )
|
||||
}
|
||||
case "subtask":
|
||||
var sFlag bool = false
|
||||
// make sure commands[1] is in boards
|
||||
for _, c := range boards {
|
||||
for _, task := range c {
|
||||
for _, subt := range task.subt {
|
||||
if subt.name == commands[1] {
|
||||
sFlag = true
|
||||
printf( "%5" )
|
||||
printf( "%-15s", subt.name )
|
||||
printf( "%20d\n", subt.fill )
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if !sFlag {
|
||||
print( "subtask <", commands[1], "> does not exist" )
|
||||
}
|
||||
default:
|
||||
//var str []string
|
||||
//str = append( str, "show" )
|
||||
//help( str )
|
||||
help( "show" )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var flag bool = false
|
||||
|
||||
// struct used for defining what constitutes a 'subtask'
|
||||
type subtask struct {
|
||||
name string // subtasks are named
|
||||
fill int // subtasks contain progress
|
||||
//ssbt subsubtask // subtasks can contain a subsubtask
|
||||
}
|
||||
|
||||
|
||||
// struct used for defining what constitutes a 'task'
|
||||
type task struct {
|
||||
name string // tasks are named
|
||||
fill int // tasks contain progress
|
||||
subt []subtask // tasks con contain a subtask
|
||||
}
|
||||
|
||||
|
||||
// boards is a hashmap map[ ]
|
||||
// that relates strings string
|
||||
// to an array of tasks []task
|
||||
var boards = make( map[string][]task )
|
||||
var tasks []task // the array of tasks referenced above
|
||||
var subtasks []subtask
|
||||
|
||||
|
||||
func main() {
|
||||
|
||||
|
||||
// test string to use in lieu of a file
|
||||
// file :=
|
||||
// "b1|tA,:sI>30.sII>30;tB,25;tC,40$b2|tA,5;tB,"
|
||||
// b1|tA,:sI>30.sII>30;tB,25;tC,40 ~ first board
|
||||
// $ ~ board delimiter
|
||||
// b2|tA,5;tB, ~ second board
|
||||
// b1 b2 ~ board names
|
||||
// |tA,:sI>30.sII>30;tB,25;tC,40 |tA,5;tB, ~ board contents
|
||||
// | | ~ task marker
|
||||
// ta tB tC tA tB ~ task names
|
||||
// ; ; ; ~ task delimiter
|
||||
// ,:sI>30.sII>30 ,25 ,40 ,5 , ~ task contents
|
||||
// , ,25 ,40 ,5 , ~ task fill
|
||||
// , , , , , ~ task fill delim
|
||||
// :sI>30.sII>30 ~ task subtasks
|
||||
// : ~ subtask marker
|
||||
// sI sII ~ subtask names
|
||||
// . ~ subtask delim
|
||||
// >30 >30 ~ subtask fill
|
||||
// > > ~ subtask fill delim
|
||||
|
||||
file, err := read( "data" )
|
||||
if err != nil {
|
||||
panic( "file read error" )
|
||||
}
|
||||
|
||||
board := split( string( file ), "$" ) // $ -> separates different boards
|
||||
|
||||
for a := 0; a < len( board ); a++ {
|
||||
bContents := split( board[a], "|" )
|
||||
bName := bContents[0]
|
||||
bTasks := bContents[1]
|
||||
if flag {
|
||||
print( "board name -> ", bName )
|
||||
}
|
||||
|
||||
tTasks := split( bTasks, ";" )
|
||||
var tk task
|
||||
for b := 0; b < len( tTasks ); b++ {
|
||||
if flag {
|
||||
print( "tTasks -> ", tTasks[b] )
|
||||
}
|
||||
subs := split( tTasks[b], ":" )
|
||||
if len( subs ) != 1 {
|
||||
sTasks := split( subs[1], "." )
|
||||
for c := 0; c < len( sTasks ); c++ {
|
||||
sContents := split( sTasks[c], ">" )
|
||||
fil, _ := atoi( sContents[1] )
|
||||
stk := subtask { name: sContents[0], fill: fil }
|
||||
subtasks = append( subtasks, stk )
|
||||
}
|
||||
tk.subt = subtasks
|
||||
}
|
||||
tContents := split( tTasks[b], "," )
|
||||
if len( tContents[1] ) == 0 {
|
||||
tContents[1] = "0"
|
||||
}
|
||||
tk.name = tContents[0]
|
||||
fil, _ := atoi( tContents[1] )
|
||||
tk.fill = fil
|
||||
tasks = append( tasks, tk )
|
||||
if flag {
|
||||
print( "[]task -> ", tasks )
|
||||
}
|
||||
tk.subt = nil
|
||||
}
|
||||
|
||||
boards[bName] = tasks
|
||||
tasks = nil
|
||||
}
|
||||
|
||||
if flag {
|
||||
print( "\n\nboards -> ", boards, "\n\n" )
|
||||
}
|
||||
|
||||
for {
|
||||
|
||||
ui := input( "-> " )
|
||||
userIn := split( ui, " " )
|
||||
command := userIn[0]
|
||||
|
||||
switch command {
|
||||
case "choose":
|
||||
choose( userIn[1:] )
|
||||
case "help":
|
||||
help( userIn[1] )
|
||||
case "mark":
|
||||
mark( userIn[1:] )
|
||||
case "move":
|
||||
move( userIn[1:] )
|
||||
case "show":
|
||||
show( userIn[1:] )
|
||||
case "exit":
|
||||
os.Exit( 0 )
|
||||
case "quit":
|
||||
os.Exit( 0 )
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user