116 lines
2.7 KiB
Go
Executable File
116 lines
2.7 KiB
Go
Executable File
package storage
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/buger/jsonparser"
|
|
)
|
|
|
|
type One struct {
|
|
ID string `json:"id"`
|
|
Question Question `json:"q"`
|
|
Answers []Answer `json:"a"`
|
|
}
|
|
|
|
func (one *One) UnmarshalJSON(b []byte) error {
|
|
if b, _, _, err := jsonparser.Get(b, "q"); err == jsonparser.KeyPathNotFoundError {
|
|
} else if err != nil {
|
|
return fmt.Errorf("failed to find question: %v: %q", err, b)
|
|
} else if err := json.Unmarshal(b, &one.Question); err != nil {
|
|
if err := json.Unmarshal([]byte(fmt.Sprintf("%q", b)), &one.Question); err != nil {
|
|
return fmt.Errorf("failed to parse question from obj: %v: %q", err, b)
|
|
}
|
|
}
|
|
|
|
if b, _, _, err := jsonparser.Get(b, "a"); err == jsonparser.KeyPathNotFoundError {
|
|
} else if err != nil {
|
|
return fmt.Errorf("failed to find answers: %v: %q", err, b)
|
|
} else if err := json.Unmarshal(b, &one.Answers); err != nil {
|
|
return fmt.Errorf("failed to parse answers: %v: %q", err, b)
|
|
}
|
|
|
|
if id, err := jsonparser.GetString(b, "id"); err != nil && err != jsonparser.KeyPathNotFoundError {
|
|
return fmt.Errorf("failed to parse id: %v: %q", err, b)
|
|
} else {
|
|
one.ID = id
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (one *One) FillIDs() {
|
|
if one.ID == "" {
|
|
one.ID = NewID()
|
|
}
|
|
if one.Question.ID == "" {
|
|
one.Question.ID = NewID()
|
|
}
|
|
for i := range one.Answers {
|
|
if one.Answers[i].ID == "" {
|
|
one.Answers[i].ID = NewID()
|
|
}
|
|
}
|
|
}
|
|
|
|
func (one One) Check(two One) bool {
|
|
if !one.CheckQuestion(two) {
|
|
log.Println("question mismatch")
|
|
return false
|
|
}
|
|
if !one.CheckAnswers(two) {
|
|
log.Println("answer mismatch")
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (one One) CheckQuestion(two One) bool {
|
|
log.Println(one.Question)
|
|
log.Println(two.Question)
|
|
log.Println(one.Question == (Question{}))
|
|
log.Println(two.Question == (Question{}))
|
|
log.Println(one.Question.Equals(two.Question.Pair))
|
|
return one.Question == (Question{}) || two.Question == (Question{}) || one.Question.Equals(two.Question.Pair)
|
|
}
|
|
|
|
func (one One) CheckAnswers(two One) bool {
|
|
log.Println(len(one.Answers), one.Answers)
|
|
log.Println(len(two.Answers), two.Answers)
|
|
if len(two.Answers) == 0 {
|
|
return false
|
|
}
|
|
for _, answer := range two.Answers {
|
|
log.Printf("%+v %s %v", answer, "with id", answer.ID)
|
|
oanswer := one.GetAnswer(answer.ID)
|
|
log.Println(" ", oanswer)
|
|
if oanswer == (Answer{}) {
|
|
return false
|
|
}
|
|
if !oanswer.Right {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (one One) GetAnswer(id string) Answer {
|
|
for _, answer := range one.Answers {
|
|
log.Println(" ", answer, "==", id)
|
|
if answer.ID == id {
|
|
return answer
|
|
}
|
|
}
|
|
return Answer{}
|
|
}
|
|
|
|
func (one One) HasSolution() bool {
|
|
for i := range one.Answers {
|
|
if one.Answers[i].Right {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|