todolist.gno

3.60 Kb · 176 lines
  1package todolistrealm
  2
  3import (
  4	"bytes"
  5	"strconv"
  6
  7	"gno.land/p/demo/avl"
  8	"gno.land/p/demo/seqid"
  9	"gno.land/p/demo/todolist"
 10	"gno.land/p/demo/ufmt"
 11)
 12
 13// State variables
 14var (
 15	todolistTree *avl.Tree
 16	tlid         seqid.ID
 17)
 18
 19// Constructor
 20func init() {
 21	todolistTree = avl.NewTree()
 22}
 23
 24func NewTodoList(title string) (int, string) {
 25	// Create new Todolist
 26	tl := todolist.NewTodoList(title)
 27	// Update AVL tree with new state
 28	tlid.Next()
 29	todolistTree.Set(strconv.Itoa(int(tlid)), tl)
 30	return int(tlid), "created successfully"
 31}
 32
 33func AddTask(todolistID int, title string) string {
 34	// Get Todolist from AVL tree
 35	tl, ok := todolistTree.Get(strconv.Itoa(todolistID))
 36	if !ok {
 37		panic("Todolist not found")
 38	}
 39
 40	// get the number of tasks in the todolist
 41	id := tl.(*todolist.TodoList).Tasks.Size()
 42
 43	// create the task
 44	task := todolist.NewTask(title)
 45
 46	// Cast raw data from tree into Todolist struct
 47	tl.(*todolist.TodoList).AddTask(id, task)
 48
 49	return "task added successfully"
 50}
 51
 52func ToggleTaskStatus(todolistID int, taskID int) string {
 53	// Get Todolist from AVL tree
 54	tl, ok := todolistTree.Get(strconv.Itoa(todolistID))
 55	if !ok {
 56		panic("Todolist not found")
 57	}
 58
 59	// Get the task from the todolist
 60	task, found := tl.(*todolist.TodoList).Tasks.Get(strconv.Itoa(taskID))
 61	if !found {
 62		panic("Task not found")
 63	}
 64
 65	// Change the status of the task
 66	todolist.ToggleTaskStatus(task.(*todolist.Task))
 67
 68	return "task status changed successfully"
 69}
 70
 71func RemoveTask(todolistID int, taskID int) string {
 72	// Get Todolist from AVL tree
 73	tl, ok := todolistTree.Get(strconv.Itoa(todolistID))
 74	if !ok {
 75		panic("Todolist not found")
 76	}
 77
 78	// Get the task from the todolist
 79	_, ok = tl.(*todolist.TodoList).Tasks.Get(strconv.Itoa(taskID))
 80	if !ok {
 81		panic("Task not found")
 82	}
 83
 84	// Change the status of the task
 85	tl.(*todolist.TodoList).RemoveTask(strconv.Itoa(taskID))
 86
 87	return "task status changed successfully"
 88}
 89
 90func RemoveTodoList(todolistID int) string {
 91	// Get Todolist from AVL tree
 92	_, ok := todolistTree.Get(strconv.Itoa(todolistID))
 93	if !ok {
 94		panic("Todolist not found")
 95	}
 96
 97	// Remove the todolist
 98	todolistTree.Remove(strconv.Itoa(todolistID))
 99
100	return "Todolist removed successfully"
101}
102
103func Render(path string) string {
104	if path == "" {
105		return renderHomepage()
106	}
107
108	return "unknown page"
109}
110
111func renderHomepage() string {
112	// Define empty buffer
113	var b bytes.Buffer
114
115	b.WriteString("# Welcome to ToDolist\n\n")
116
117	// If no todolists have been created
118	if todolistTree.Size() == 0 {
119		b.WriteString("### No todolists available currently!")
120		return b.String()
121	}
122
123	// Iterate through AVL tree
124	todolistTree.Iterate("", "", func(key string, value any) bool {
125		// cast raw data from tree into Todolist struct
126		tl := value.(*todolist.TodoList)
127
128		// Add Todolist name
129		b.WriteString(
130			ufmt.Sprintf(
131				"## Todolist #%s: %s\n",
132				key, // Todolist ID
133				tl.GetTodolistTitle(),
134			),
135		)
136
137		// Add Todolist owner
138		b.WriteString(
139			ufmt.Sprintf(
140				"#### Todolist owner : %s\n",
141				tl.GetTodolistOwner(),
142			),
143		)
144
145		// List all todos that are currently Todolisted
146		if todos := tl.GetTasks(); len(todos) > 0 {
147			b.WriteString(
148				ufmt.Sprintf("Currently Todo tasks: %d\n\n", len(todos)),
149			)
150
151			for index, todo := range todos {
152				b.WriteString(
153					ufmt.Sprintf("#%d - %s  ", index, todo.Title),
154				)
155				// displays a checked box if task is marked as done, an empty box if not
156				if todo.Done {
157					b.WriteString(
158						"☑\n\n",
159					)
160					continue
161				}
162
163				b.WriteString(
164					"☐\n\n",
165				)
166			}
167		} else {
168			b.WriteString("No tasks in this list currently\n")
169		}
170
171		b.WriteString("\n")
172		return false
173	})
174
175	return b.String()
176}