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

View File

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