diff --git a/cmd/quiz/start.go b/cmd/quiz/start.go index fedbc0f..a77fd3a 100644 --- a/cmd/quiz/start.go +++ b/cmd/quiz/start.go @@ -1,7 +1,10 @@ package quiz import ( + "fmt" + "github.com/spf13/cobra" + "github.com/vaibhav135/go-quiz-app/pkg/quiz/database" "github.com/vaibhav135/go-quiz-app/pkg/quiz/gui" ) @@ -9,21 +12,34 @@ var startCmd = &cobra.Command{ Use: "start", Short: "Start the quiz and check your skillz...", Args: func(cmd *cobra.Command, args []string) error { - return nil }, RunE: func(cmd *cobra.Command, args []string) error { - gui.Timer(3) + if timerDuration < 1 { + return fmt.Errorf("\n Timer duration cannot be less than 1 minute \n") + } + + if totalQuestions < 5 { + return fmt.Errorf("\n Total questions can't be less than 5 \n") + } + + // database. + quizContent := database.QuizInstance.List(totalQuestions) + + // Since timeDuration is in seconds we are converting it to minutes. + timerDurationInMinutes := timerDuration * 60 + gui.QuizGUI(timerDurationInMinutes, quizContent) + fmt.Println(quizContent) return nil }, } -var timer int +var timerDuration, totalQuestions int func init() { - startCmd.Flags().IntVarP(&timer, "timer", "t", 1, "Timer for the quiz (time is in mins)") - startCmd.Flags().IntVarP(&timer, "totalQuestions", "q", 10, "Total no. of questions you want to have in the quiz") + startCmd.Flags().IntVarP(&timerDuration, "timer", "t", 1, "Timer for the quiz (time is in mins)") + startCmd.Flags().IntVarP(&totalQuestions, "totalQuestions", "q", 10, "Total no. of questions you want to have in the quiz") rootCmd.AddCommand(startCmd) } diff --git a/pkg/quiz/constants.go b/pkg/quiz/constants.go index c9920b7..5aafc2d 100644 --- a/pkg/quiz/constants.go +++ b/pkg/quiz/constants.go @@ -1,11 +1,11 @@ package quiz const ( - Json = "json" - Csv = "csv" + Json = "json" + Csv = "csv" ) type QuizContent struct { - Question string `json:"question"` - Answer string `json:"answer"` + Question string `json:"question"` + Answer string `json:"answer"` } diff --git a/pkg/quiz/database/db.go b/pkg/quiz/database/db.go index 1d6b572..095dae0 100644 --- a/pkg/quiz/database/db.go +++ b/pkg/quiz/database/db.go @@ -8,7 +8,7 @@ import ( "sync" _ "github.com/mattn/go-sqlite3" - "github.com/vaibhav135/go-quiz-app/pkg/quiz" + TQuiz "github.com/vaibhav135/go-quiz-app/pkg/quiz" ) type Quiz struct { @@ -73,10 +73,30 @@ func create() (*sql.DB, error) { } -func (quiz *Quiz) List(numberOfQuiz int) { +func (quiz *Quiz) List(numberOfQuiz int) []TQuiz.QuizContent { + rows, err := quiz.DB.Query(quizListQuery, numberOfQuiz) + + if err != nil { + log.Panic(err) + } + + var quizContent = []TQuiz.QuizContent{} + + for rows.Next() { + var ( + Question string + Answer string + ) + if err := rows.Scan(&Question, &Answer); err != nil { + log.Fatal(err) + } + quizContent = append(quizContent, TQuiz.QuizContent{Question: Question, Answer: Answer}) + } + + return quizContent } -func (quiz *Quiz) BulkInsert(quizData []quiz.QuizContent) { +func (quiz *Quiz) BulkInsert(quizData []TQuiz.QuizContent) { stmt, err := quiz.DB.Prepare(quizInsertQuery) if err != nil { diff --git a/pkg/quiz/database/query.go b/pkg/quiz/database/query.go index c174a30..b2aef28 100644 --- a/pkg/quiz/database/query.go +++ b/pkg/quiz/database/query.go @@ -1,10 +1,11 @@ package database - var dbSeedQuery = `CREATE TABLE IF NOT EXISTS quiz ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, question TEXT UNIQUE NOT NULL, answer VARCHAR(100) NOT NULL - )` + )` var quizInsertQuery = `INSERT INTO quiz(question, answer) VALUES(?, ?)` + +var quizListQuery = `SELECT question, answer FROM quiz ORDER BY RANDOM() LIMIT ?` diff --git a/pkg/quiz/gui/quiz_gui.go b/pkg/quiz/gui/quiz_gui.go new file mode 100644 index 0000000..f20ca7f --- /dev/null +++ b/pkg/quiz/gui/quiz_gui.go @@ -0,0 +1,40 @@ +package gui + +import ( + "github.com/rivo/tview" + "github.com/vaibhav135/go-quiz-app/pkg/quiz" +) + +// Ref: https://github.com/rivo/tview/wiki/Grid +func QuizGUI(duration int, quizContent []quiz.QuizContent) { + app = tview.NewApplication() + + newPrimitive := func(text string) tview.Primitive { + return tview.NewTextView(). + SetTextAlign(tview.AlignCenter). + SetText(text) + } + + timerPrimitive := func() tview.Primitive { + return timer(duration) + } + + header := timerPrimitive() + main := newPrimitive("") + footer := newPrimitive("") + + grid := tview.NewGrid(). + SetRows(6, 0, 5). + SetBorders(true) + + // Layout for screens narrower than 100 cells (menu and side bar are hidden). + grid.AddItem(header, 0, 0, 1, 3, 0, 0, false). + AddItem(main, 1, 0, 1, 3, 0, 0, false). + AddItem(footer, 2, 0, 1, 3, 0, 0, false) + + app.SetRoot(grid, true).SetFocus(grid) + + if err := app.Run(); err != nil { + panic(err) + } +} diff --git a/pkg/quiz/gui/timer.go b/pkg/quiz/gui/timer.go index d9e6357..2084d40 100644 --- a/pkg/quiz/gui/timer.go +++ b/pkg/quiz/gui/timer.go @@ -48,14 +48,12 @@ func refresh() { } } -func Timer(durationArg int) { +func timer(durationArg int) tview.Primitive { duration = durationArg - app = tview.NewApplication() view = tview.NewBox().SetDrawFunc(drawTime) go refresh() - if err := app.SetRoot(view, true).Run(); err != nil { - panic(err) - } + + return view }