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}