You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
go-todo/todo.go

98 lines
2.2 KiB

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
}