explicit types to wrap strings over lotsa strings

master
bel 2023-04-04 20:28:00 -06:00
parent 37699b7b8d
commit eb35f1428b
3 changed files with 41 additions and 36 deletions

BIN
anki.d

Binary file not shown.

41
main.go
View File

@ -13,30 +13,35 @@ import (
type ( type (
DB interface { DB interface {
HistoryOf(string) map[string][]History HistoryOf(IDU) map[IDQ][]History
Next(string, string) time.Time Next(IDU, IDQ) time.Time
Question(string) Question Question(IDQ) Question
LastAnswer(string, string) (string, Answer) LastAnswer(IDU, IDQ) (IDA, Answer)
Answer(string) Answer Answer(IDA) Answer
PushAnswer(string, string, string, bool) error PushAnswer(IDU, IDQ, Renderable, bool) error
Close() Close()
} }
Question struct { Question struct {
Q string Q Renderable
Clues []string Clues []Renderable
Tags []string Tags []IDT
} }
Answer struct { Answer struct {
Q string Q IDQ
A string A Renderable
TS int64 TS int64
Author string Author IDU
} }
History struct { History struct {
A string A IDA
TS int64 TS int64
Pass bool Pass bool
} }
IDA string
IDQ string
IDU string
IDT string
Renderable string
) )
func main() { func main() {
@ -51,14 +56,14 @@ func Main() error {
return err return err
} }
defer db.Close() defer db.Close()
user := os.Getenv("USER") user := IDU(os.Getenv("USER"))
for q, _ := range db.HistoryOf(user) { for q, _ := range db.HistoryOf(user) {
if time.Until(db.Next(user, q)) > 0 { if time.Until(db.Next(user, q)) > 0 {
continue continue
} }
question := db.Question(q) question := db.Question(q)
fmt.Printf("> Q: ") fmt.Printf("> Q: ")
if strings.HasPrefix(question.Q, "img:") { if strings.HasPrefix(string(question.Q), "img:") {
} else { } else {
fmt.Printf("%s", question.Q) fmt.Printf("%s", question.Q)
} }
@ -90,11 +95,11 @@ func Main() error {
switch readline() { switch readline() {
case "s": case "s":
case "n": case "n":
if err := db.PushAnswer(user, q, response, false); err != nil { if err := db.PushAnswer(user, q, Renderable(response), false); err != nil {
return err return err
} }
default: default:
if err := db.PushAnswer(user, q, response, true); err != nil { if err := db.PushAnswer(user, q, Renderable(response), true); err != nil {
return err return err
} }
} }
@ -117,7 +122,7 @@ func NewDB() (DB, error) {
return newYamlDB(os.Getenv("DB")) return newYamlDB(os.Getenv("DB"))
} }
func (q Question) Tagged(tag string) bool { func (q Question) Tagged(tag IDT) bool {
for i := range q.Tags { for i := range q.Tags {
if q.Tags[i] == tag { if q.Tags[i] == tag {
return true return true

View File

@ -12,19 +12,19 @@ type (
yamlDB struct { yamlDB struct {
addr string addr string
Knowledge knowledge Knowledge knowledge
Users map[string]user Users map[IDU]user
Cadence []duration Cadence []duration
} }
knowledge struct { knowledge struct {
Questions map[string]Question Questions map[IDQ]Question
Answers map[string]Answer Answers map[IDA]Answer
} }
user struct { user struct {
Tags tags Tags tags
History map[string][]History History map[IDQ][]History
} }
tags struct { tags struct {
Assignments []string Assignments []IDT
} }
) )
@ -32,10 +32,10 @@ func newYamlDB(p string) (yamlDB, error) {
db := yamlDB{ db := yamlDB{
addr: p, addr: p,
Knowledge: knowledge{ Knowledge: knowledge{
Questions: map[string]Question{}, Questions: map[IDQ]Question{},
Answers: map[string]Answer{}, Answers: map[IDA]Answer{},
}, },
Users: map[string]user{}, Users: map[IDU]user{},
Cadence: []duration{}, Cadence: []duration{},
} }
if b, err := os.ReadFile(p); err != nil { if b, err := os.ReadFile(p); err != nil {
@ -62,8 +62,8 @@ func (db yamlDB) Close() {
} }
} }
func (db yamlDB) HistoryOf(user string) map[string][]History { func (db yamlDB) HistoryOf(user IDU) map[IDQ][]History {
result := map[string][]History{} result := map[IDQ][]History{}
for k, v := range db.Users[user].History { for k, v := range db.Users[user].History {
result[k] = append([]History{}, v...) result[k] = append([]History{}, v...)
} }
@ -77,7 +77,7 @@ func (db yamlDB) HistoryOf(user string) map[string][]History {
return result return result
} }
func (db yamlDB) Next(user, q string) time.Time { func (db yamlDB) Next(user IDU, q IDQ) time.Time {
history := db.Users[user].History[q] history := db.Users[user].History[q]
progress := 0 progress := 0
for i := range history { for i := range history {
@ -95,12 +95,12 @@ func (db yamlDB) Next(user, q string) time.Time {
return db.lastTS(user, q).Add(time.Duration(db.Cadence[progress])) return db.lastTS(user, q).Add(time.Duration(db.Cadence[progress]))
} }
func (db yamlDB) Question(q string) Question { func (db yamlDB) Question(q IDQ) Question {
return db.Knowledge.Questions[q] return db.Knowledge.Questions[q]
} }
func (db yamlDB) LastAnswer(user, q string) (string, Answer) { func (db yamlDB) LastAnswer(user IDU, q IDQ) (IDA, Answer) {
maxk := "" var maxk IDA
var maxv Answer var maxv Answer
for k, v := range db.Knowledge.Answers { for k, v := range db.Knowledge.Answers {
if v.Q == q && v.Author == user { if v.Q == q && v.Author == user {
@ -113,12 +113,12 @@ func (db yamlDB) LastAnswer(user, q string) (string, Answer) {
return maxk, maxv return maxk, maxv
} }
func (db yamlDB) Answer(a string) Answer { func (db yamlDB) Answer(a IDA) Answer {
return db.Knowledge.Answers[a] return db.Knowledge.Answers[a]
} }
func (db yamlDB) PushAnswer(user, q, a string, pass bool) error { func (db yamlDB) PushAnswer(user IDU, q IDQ, a Renderable, pass bool) error {
uuid := uuid.New().String() uuid := IDA(uuid.New().String())
db.Knowledge.Answers[uuid] = Answer{ db.Knowledge.Answers[uuid] = Answer{
Q: q, Q: q,
A: a, A: a,
@ -133,7 +133,7 @@ func (db yamlDB) PushAnswer(user, q, a string, pass bool) error {
return nil return nil
} }
func (db yamlDB) lastTS(user, q string) time.Time { func (db yamlDB) lastTS(user IDU, q IDQ) time.Time {
max := int64(0) max := int64(0)
for _, v := range db.Users[user].History[q] { for _, v := range db.Users[user].History[q] {
if v.TS > max { if v.TS > max {