99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"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 {
|
|
Title string
|
|
Content string
|
|
}
|
|
|
|
type Todos struct {
|
|
Items []Todo
|
|
}
|
|
|
|
func (todo *Todos) AddTodo(newTodo Todo) {
|
|
todo.Items = append(todo.Items, newTodo)
|
|
}
|
|
|
|
func (todo *Todos) RemoveTodo(index int) (err error) {
|
|
//remove todo via index
|
|
if len(todo.Items) == 0 {
|
|
return errors.New("[ERR] Todo list is empty!\n")
|
|
}
|
|
|
|
if index > len(todo.Items) {
|
|
return errors.New("[ERR] Index out of bounds\n")
|
|
}
|
|
|
|
todo.Items = append(todo.Items[:index], todo.Items[index+1:]...)
|
|
return nil
|
|
}
|
|
|
|
func (todo *Todos) ListTodo() (err error) {
|
|
// 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 {
|
|
return errors.New("[ERR] Todo list is empty!\n")
|
|
}
|
|
for k, v := range todo.Items {
|
|
id("[%d]", k)
|
|
title("%s", v.Title)
|
|
content("%s\n", v.Content)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
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
|
|
}
|