package main import ( "encoding/csv" "fmt" "os" "strconv" ) func main() { args := os.Args if len(args) < 2 { fmt.Println("Use godo ? or help for the help menu") os.Exit(0) } switch args[1] { case "?", "help": help() case "a", "add": add(args[2]) case "l", "list": list() case "d", "delete": delete(args[2]) } } // List all available commands func help() { fmt.Println("?/help - help menu") fmt.Println("a/add - add new task. Must be in quotations") fmt.Println("d/delete - delete task") fmt.Println("l/list - list all tasks") } // Add new task func add(task string) { file, err := os.OpenFile("tasks.csv", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err != nil { fmt.Println("Error Creating File;", err) os.Exit(1) } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() var taskWrite []string taskWrite = append(taskWrite, task) writer.Write(taskWrite) } // List all current tasks func list() { file, err := os.Open("tasks.csv") if err != nil { fmt.Printf("Error: %v", err) } defer file.Close() if err != nil { fmt.Printf("Error: %v", err) } reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { fmt.Printf("Error: %v", err) } x := 1 for _, record := range records { fmt.Printf("%x - %s\n", x, record[0]) x += 1 } } // Delete the requested task func delete(task string) { fileName := "tasks.csv" // Convert arg to int taskInt, err := strconv.Atoi(task) if err != nil { fmt.Println("error") } //open the task csv file, err := os.Open(fileName) if err != nil { fmt.Printf("Error: %v", err) } defer file.Close() if err != nil { fmt.Printf("Error: %v", err) } //read the file reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { fmt.Printf("Error: %v", err) } //close file and delete file.Close() os.Remove(fileName) //check if the arg number is equal to the csv line number. If not pass it to the add function to readd it x := 1 for _, record := range records { if x != taskInt { add(record[0]) } x += 1 } }