Skip to content

Commit

Permalink
feat: driver results
Browse files Browse the repository at this point in the history
  • Loading branch information
acifani committed Nov 29, 2022
1 parent be0742d commit 3990556
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 6 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
- Season schedule
- Race results
- Qualifying results
- Driver results

## Install

Expand Down
Binary file modified demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions demo.tape
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ Sleep 500ms
Enter
Sleep 3s

Down@500ms 4
Sleep 1.5s
Enter
Sleep 5s

Type "c"
Sleep 3s

Expand Down
109 changes: 109 additions & 0 deletions internal/ui/driver/driver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package driver

import (
"github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea"

"github.com/acifani/formula1-go/internal/ui"
"github.com/acifani/formula1-go/internal/ui/page"
"github.com/acifani/formula1-go/pkg/api"
)

type model struct {
data *api.RaceTable
table table.Model
styles ui.Styles
err error
}

type LoadDone struct {
err error
data *api.RaceTable
}

type BackMsg struct{}

func New(styles ui.Styles) page.Model {
columns := []table.Column{
{Title: "#", Width: 4},
{Title: "Race", Width: 25},
{Title: "Pos", Width: 4},
{Title: "Pts", Width: 4},
{Title: "Status", Width: 15},
}
t := table.New(table.WithColumns(columns))
t.SetStyles(styles.Table)

return &model{table: t, styles: styles}
}

func (m model) GetPageTitle() string {
if m.data != nil {
driver := m.data.Races[0].Results[0].Driver
team := m.data.Races[0].Results[0].Constructor
return driver.PermanentNumber + " " + driver.GivenName + " " + driver.FamilyName + " - " + team.Name
}
return ""
}

func (m model) Init() tea.Cmd {
return nil
}

func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
var cmd tea.Cmd

switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "esc":
return m, backMsg
}
case LoadDone:
if msg.err != nil {
m.err = msg.err
} else {
m.data = msg.data
rows := generateRows(msg.data)
m.table.SetHeight(len(rows))
m.table.SetRows(rows)
}
}

m.table, cmd = m.table.Update(msg)

return m, cmd
}

func (m model) View() string {
if m.err != nil {
return m.styles.Paragraph.Render(m.err.Error())
}

return m.table.View()
}

func LoadResults(year, driverID string) tea.Cmd {
return func() tea.Msg {
results, err := api.GetDriverRaceResults(year, driverID)
return LoadDone{data: results, err: err}
}
}

func generateRows(data *api.RaceTable) []table.Row {
rows := make([]table.Row, len(data.Races))
for i, race := range data.Races {
rows[i] = table.Row{
race.Round,
race.RaceName,
race.Results[0].PositionText,
race.Results[0].Points,
race.Results[0].Status,
}
}
return rows
}

func backMsg() tea.Msg {
return BackMsg{}
}
7 changes: 7 additions & 0 deletions internal/ui/program/program.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
tea "github.com/charmbracelet/bubbletea"

"github.com/acifani/formula1-go/internal/ui"
"github.com/acifani/formula1-go/internal/ui/driver"
"github.com/acifani/formula1-go/internal/ui/page"
"github.com/acifani/formula1-go/internal/ui/quali"
"github.com/acifani/formula1-go/internal/ui/results"
Expand All @@ -20,6 +21,7 @@ const (
PageWDC = iota
PageSeason = iota
PageQuali = iota
PageDriver = iota
)

type Page = int8
Expand Down Expand Up @@ -48,6 +50,7 @@ func (m *model) Init() tea.Cmd {
PageWDC: wdc.New(m.styles),
PageSeason: season.New(m.styles),
PageQuali: quali.New(m.styles),
PageDriver: driver.New(m.styles),
}

return m.getCurrentPageModel().Init()
Expand Down Expand Up @@ -81,9 +84,13 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.currentPage = PageResults
case quali.LoadDone:
m.currentPage = PageQuali
case driver.LoadDone:
m.currentPage = PageDriver
case results.BackMsg, quali.BackMsg:
m.currentPage = PageSeason
cmds = append(cmds, m.getCurrentPageModel().Init())
case driver.BackMsg:
m.currentPage = PageResults
}

currentPageModel := m.getCurrentPageModel()
Expand Down
11 changes: 9 additions & 2 deletions internal/ui/results/results.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
tea "github.com/charmbracelet/bubbletea"

"github.com/acifani/formula1-go/internal/ui"
"github.com/acifani/formula1-go/internal/ui/driver"
"github.com/acifani/formula1-go/internal/ui/page"
"github.com/acifani/formula1-go/internal/ui/quali"
"github.com/acifani/formula1-go/pkg/api"
Expand Down Expand Up @@ -33,8 +34,8 @@ func New(styles ui.Styles) page.Model {
{Title: "Time", Width: 12},
{Title: "Pts", Width: 4},
}
t := table.New(table.WithColumns(columns))
t.SetStyles(styles.Table)
t := table.New(table.WithColumns(columns), table.WithFocused(true))
t.SetStyles(styles.SelectableTable)

return &model{table: t, styles: styles}
}
Expand Down Expand Up @@ -62,6 +63,12 @@ func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
if m.data != nil {
return m, quali.LoadResults(m.data.Season, m.data.Round)
}
case "enter":
if m.data != nil {
idx := m.table.Cursor()
driverID := m.data.Races[0].Results[idx].Driver.DriverID
return m, driver.LoadResults(m.data.Season, driverID)
}
}
case LoadDone:
if msg.err != nil {
Expand Down
21 changes: 17 additions & 4 deletions internal/ui/wdc/wdc.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package wdc

import (
"github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea"

"github.com/acifani/formula1-go/internal/ui"
"github.com/acifani/formula1-go/internal/ui/driver"
"github.com/acifani/formula1-go/internal/ui/page"
"github.com/acifani/formula1-go/pkg/api"
"github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea"
)

type model struct {
data *api.DriverStandingsTable
table table.Model
styles ui.Styles
err error
Expand All @@ -27,8 +30,8 @@ func New(styles ui.Styles) page.Model {
{Title: "Pts", Width: 4},
{Title: "Wins", Width: 4},
}
t := table.New(table.WithColumns(columns))
t.SetStyles(styles.Table)
t := table.New(table.WithColumns(columns), table.WithFocused(true))
t.SetStyles(styles.SelectableTable)

return &model{table: t, styles: styles}
}
Expand All @@ -44,10 +47,20 @@ func (m model) Init() tea.Cmd {
func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "enter":
if m.data != nil {
idx := m.table.Cursor()
driverID := m.data.StandingsLists[0].DriverStandings[idx].Driver.DriverID
return m, driver.LoadResults(m.data.Season, driverID)
}
}
case fetchDone:
if msg.err != nil {
m.err = msg.err
} else {
m.data = msg.data
rows := generateRows(msg.data)
m.table.SetHeight(len(rows))
m.table.SetRows(rows)
Expand Down
9 changes: 9 additions & 0 deletions pkg/api/ergast.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ func GetQualifyingResult(year, round string) (*QualifyingTable, error) {
return &result.MRData.RaceTable, nil
}

func GetDriverRaceResults(year, driverID string) (*RaceTable, error) {
result := RaceResultResponse{}
err := apiCall(fmt.Sprintf("/%s/drivers/%s/results.json", year, driverID), &result)
if err != nil {
return nil, err
}
return &result.MRData.RaceTable, nil
}

func apiCall(url string, v interface{}) error {
res, err := http.Get(baseURL + url)
if err != nil {
Expand Down

0 comments on commit 3990556

Please sign in to comment.