Compare commits
No commits in common. "0b272423383e9f9ed70a54e28abfc2b4b30c07f0" and "5ab7eb6e0b5d7c066ee43fcf1ebb803941adef68" have entirely different histories.
0b27242338
...
5ab7eb6e0b
7
go.mod
7
go.mod
@ -1,10 +1,3 @@
|
|||||||
module todo-app
|
module todo-app
|
||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/fatih/color v1.15.0 // indirect
|
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
||||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
|
||||||
golang.org/x/sys v0.6.0 // indirect
|
|
||||||
)
|
|
||||||
|
10
go.sum
10
go.sum
@ -1,10 +0,0 @@
|
|||||||
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
|
|
||||||
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
|
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
|
||||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
|
||||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
44
main.go
44
main.go
@ -4,7 +4,6 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func PrintMenu() {
|
func PrintMenu() {
|
||||||
@ -12,26 +11,17 @@ func PrintMenu() {
|
|||||||
fmt.Printf("1: List Todo\n")
|
fmt.Printf("1: List Todo\n")
|
||||||
fmt.Printf("2: Add Todo\n")
|
fmt.Printf("2: Add Todo\n")
|
||||||
fmt.Printf("3: Remove Todo (via index)\n")
|
fmt.Printf("3: Remove Todo (via index)\n")
|
||||||
fmt.Printf("4: Save to file\n")
|
|
||||||
|
|
||||||
fmt.Printf("\n\n0: Quit\n> ")
|
fmt.Printf("\n\n0: List menu again\n")
|
||||||
|
fmt.Printf("4: Quit\n\n> ")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
QUIT = 0
|
|
||||||
LIST = 1
|
|
||||||
ADD = 2
|
|
||||||
REMOVE = 3
|
|
||||||
SAVE = 4
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Print("\033[H\033[2J") //clear
|
fmt.Print("\033[H\033[2J") //clear
|
||||||
PrintMenu()
|
PrintMenu()
|
||||||
list := Todos{}
|
list := Todos{}
|
||||||
for {
|
for {
|
||||||
|
|
||||||
var input int
|
var input int
|
||||||
n, err := fmt.Scanln(&input)
|
n, err := fmt.Scanln(&input)
|
||||||
if n < 1 || err != nil {
|
if n < 1 || err != nil {
|
||||||
@ -39,15 +29,12 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch input {
|
switch input {
|
||||||
case QUIT:
|
case 0:
|
||||||
fmt.Print("Quitting, goodbye!\n")
|
|
||||||
os.Exit(0)
|
|
||||||
case LIST:
|
|
||||||
if err := list.ListTodo(); err != nil {
|
|
||||||
fmt.Print(err)
|
|
||||||
}
|
|
||||||
PrintMenu()
|
PrintMenu()
|
||||||
case ADD:
|
case 1:
|
||||||
|
list.ListTodo()
|
||||||
|
PrintMenu()
|
||||||
|
case 2:
|
||||||
in := bufio.NewReader(os.Stdin)
|
in := bufio.NewReader(os.Stdin)
|
||||||
|
|
||||||
fmt.Print("Add Title:\n> ")
|
fmt.Print("Add Title:\n> ")
|
||||||
@ -59,7 +46,7 @@ func main() {
|
|||||||
list.AddTodo(Todo{Title: title, Content: content})
|
list.AddTodo(Todo{Title: title, Content: content})
|
||||||
fmt.Printf("Added %s to the list!\n", title)
|
fmt.Printf("Added %s to the list!\n", title)
|
||||||
PrintMenu()
|
PrintMenu()
|
||||||
case REMOVE:
|
case 3:
|
||||||
var index int
|
var index int
|
||||||
fmt.Printf("Which TODO to remove?\n> ")
|
fmt.Printf("Which TODO to remove?\n> ")
|
||||||
|
|
||||||
@ -71,18 +58,9 @@ func main() {
|
|||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
}
|
}
|
||||||
PrintMenu()
|
PrintMenu()
|
||||||
case SAVE:
|
case 4:
|
||||||
in := bufio.NewReader(os.Stdin)
|
fmt.Print("Quitting, goodbye!\n")
|
||||||
fmt.Print("Save to file:\n> ")
|
os.Exit(0)
|
||||||
filename, _ := in.ReadString('\n')
|
|
||||||
filename = strings.TrimSuffix(filename, "\n")
|
|
||||||
|
|
||||||
if err := list.SaveToFile(filename); err != nil {
|
|
||||||
fmt.Print(err)
|
|
||||||
} else {
|
|
||||||
fmt.Printf("%s saved!\n", filename)
|
|
||||||
}
|
|
||||||
PrintMenu()
|
|
||||||
default:
|
default:
|
||||||
PrintMenu()
|
PrintMenu()
|
||||||
}
|
}
|
||||||
|
63
todo.go
63
todo.go
@ -3,19 +3,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/fatih/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func check(err error) {
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "[ERR] %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Todo struct {
|
type Todo struct {
|
||||||
Title string
|
Title string
|
||||||
Content string
|
Content string
|
||||||
@ -43,56 +32,12 @@ func (todo *Todos) RemoveTodo(index int) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (todo *Todos) ListTodo() (err error) {
|
func (todo *Todos) ListTodo() int {
|
||||||
// Create a custom print function for convenience
|
|
||||||
id := color.New(color.Bold, color.FgGreen).PrintfFunc()
|
|
||||||
title := color.New(color.Bold, color.FgBlue).PrintfFunc()
|
|
||||||
content := color.New(color.Bold, color.FgWhite).PrintfFunc()
|
|
||||||
|
|
||||||
if len(todo.Items) == 0 {
|
if len(todo.Items) == 0 {
|
||||||
return errors.New("[ERR] Todo list is empty!\n")
|
return 0
|
||||||
}
|
}
|
||||||
for k, v := range todo.Items {
|
for k, v := range todo.Items {
|
||||||
id("[%d]", k)
|
fmt.Printf("%d:%s\n", k, v)
|
||||||
title("%s", v.Title)
|
|
||||||
content("%s\n", v.Content)
|
|
||||||
}
|
}
|
||||||
return nil
|
return 1
|
||||||
}
|
|
||||||
|
|
||||||
func (todo *Todos) SaveToFile(filename string) error {
|
|
||||||
var sb strings.Builder
|
|
||||||
var FILE *os.File
|
|
||||||
|
|
||||||
filename = filename + ".txt"
|
|
||||||
for k, v := range todo.Items {
|
|
||||||
fmt.Printf("#%d,%s,%s;\n", k, strings.ReplaceAll(v.Title, "\n", ""), strings.ReplaceAll(v.Content, "\n", ""))
|
|
||||||
sb.WriteString(strconv.Itoa(k))
|
|
||||||
sb.WriteString(",")
|
|
||||||
sb.WriteString(strings.ReplaceAll(v.Title, "\n", ""))
|
|
||||||
sb.WriteString(",")
|
|
||||||
sb.WriteString(strings.ReplaceAll(v.Content, "\n", ""))
|
|
||||||
sb.WriteString(";\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
content := sb.String()
|
|
||||||
|
|
||||||
fmt.Println(content)
|
|
||||||
|
|
||||||
if _, err := os.Stat(filename); err != nil {
|
|
||||||
if FILE, err = os.Create(filename); err != nil {
|
|
||||||
return errors.New("[ERR] could not create file \n")
|
|
||||||
}
|
|
||||||
return errors.New("[ERR] file does not exist, creating one...\n")
|
|
||||||
}
|
|
||||||
FILE, _ = os.Create(filename) //errors already handled
|
|
||||||
|
|
||||||
if _, err := FILE.WriteString(content); err != nil {
|
|
||||||
return err
|
|
||||||
//return errors.New("[ERR] could not write to file\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.Reset() //reset the string builder
|
|
||||||
FILE.Close() //close the file
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user