package main import "core:flags" import "core:fmt" import "core:time" Command :: enum { usage, init, add, symptom, event, show, events, version, } Command_Func :: distinct proc(args: []string) Command_Data := [Command]struct { func: Command_Func, desc: string, } { .usage = {func = command_usage, desc = "this screen"}, .init = {func = command_init, desc = "set up the hoard"}, .add = {func = command_add, desc = "log today's daily entry"}, .symptom = {func = command_symptom, desc = "note a symptom"}, .event = {func = command_event, desc = "log a timestamped event"}, .show = {func = command_show, desc = "show a specific date"}, .events = {func = command_events, desc = "list events"}, .version = {func = command_version, desc = "print version"}, } command_from_string :: proc(cmd_str: string) -> Command { cmd: Command switch cmd_str { case "usage": cmd = .usage case "init": cmd = .init case "add": cmd = .add case "symptom": cmd = .symptom case "event": cmd = .event case "show": cmd = .show case "events": cmd = .events case "version": cmd = .version } return cmd } RESET :: "\e[0m" BOLD :: "\e[1m" DIM :: "\e[2m" YELLOW :: "\e[33m" GREEN :: "\e[32m" command_usage :: proc(args: []string) { fmt.printf("%s🧌 Data Goblin%s v%s\n\n", BOLD, RESET, "0.1") fmt.printf(" %sThe goblin stares at you. You forgot to say what you want.%s\n\n", DIM, RESET) fmt.printf(" Available commands:\n\n") for data, cmd in Command_Data { fmt.printf(" %s%-14s%s %s%s%s\n", GREEN, cmd, RESET, DIM, data.desc, RESET) } fmt.printf("\n Usage: %sdgob [flags]%s\n\n", YELLOW, RESET) } Init_Options :: struct { db: string `usage:"path to sqlite-file to use (defaults to ./data.db)"`, } command_init :: proc(args: []string) { fmt.printf("init\n") fmt.printf("args: %v\n", args) opt: Init_Options flags.parse_or_exit(&opt, args, .Unix) } Add_Options :: struct { mood: int `args:"required" usage:"mood of the day, 1-5"`, sleep: f32 `args:"required" usage:"the amount of slept hours (ex: 1.5)"`, sleep_quality: int `args:"required" usage:"the previous night's sleep quality, 1-5"`, date: time.Time `usage:"date to record this data to"`, notes: string `usage:"any extra notes for the day"`, } command_add :: proc(args: []string) { fmt.printf("add\n") fmt.printf("args: %v\n", args) opt: Add_Options flags.parse_or_exit(&opt, args, .Unix) if err := storage_add_to_daily_log(nil, opt.mood, opt.sleep, opt.sleep_quality, opt.date, opt.notes); err != nil { fmt.eprintf("failed adding log: %v\n", err) } } command_symptom :: proc(args: []string) { fmt.printf("symptom\n") fmt.printf("args: %v\n", args) } command_event :: proc(args: []string) { fmt.printf("event\n") fmt.printf("args: %v\n", args) } command_show :: proc(args: []string) { fmt.printf("show\n") fmt.printf("args: %v\n", args) } command_events :: proc(args: []string) { fmt.printf("events\n") fmt.printf("args: %v\n", args) } command_version :: proc(args: []string) { fmt.printf("version\n") fmt.printf("args: %v\n", args) }