Skip to content

Commit 3990556

Browse files
committed
feat: driver results
1 parent be0742d commit 3990556

File tree

8 files changed

+157
-6
lines changed

8 files changed

+157
-6
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- Season schedule
1212
- Race results
1313
- Qualifying results
14+
- Driver results
1415

1516
## Install
1617

demo.gif

103 KB
Loading

demo.tape

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ Sleep 500ms
99
Enter
1010
Sleep 3s
1111

12+
Down@500ms 4
13+
Sleep 1.5s
14+
Enter
15+
Sleep 5s
16+
1217
Type "c"
1318
Sleep 3s
1419

internal/ui/driver/driver.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package driver
2+
3+
import (
4+
"github.com/charmbracelet/bubbles/table"
5+
tea "github.com/charmbracelet/bubbletea"
6+
7+
"github.com/acifani/formula1-go/internal/ui"
8+
"github.com/acifani/formula1-go/internal/ui/page"
9+
"github.com/acifani/formula1-go/pkg/api"
10+
)
11+
12+
type model struct {
13+
data *api.RaceTable
14+
table table.Model
15+
styles ui.Styles
16+
err error
17+
}
18+
19+
type LoadDone struct {
20+
err error
21+
data *api.RaceTable
22+
}
23+
24+
type BackMsg struct{}
25+
26+
func New(styles ui.Styles) page.Model {
27+
columns := []table.Column{
28+
{Title: "#", Width: 4},
29+
{Title: "Race", Width: 25},
30+
{Title: "Pos", Width: 4},
31+
{Title: "Pts", Width: 4},
32+
{Title: "Status", Width: 15},
33+
}
34+
t := table.New(table.WithColumns(columns))
35+
t.SetStyles(styles.Table)
36+
37+
return &model{table: t, styles: styles}
38+
}
39+
40+
func (m model) GetPageTitle() string {
41+
if m.data != nil {
42+
driver := m.data.Races[0].Results[0].Driver
43+
team := m.data.Races[0].Results[0].Constructor
44+
return driver.PermanentNumber + " " + driver.GivenName + " " + driver.FamilyName + " - " + team.Name
45+
}
46+
return ""
47+
}
48+
49+
func (m model) Init() tea.Cmd {
50+
return nil
51+
}
52+
53+
func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
54+
var cmd tea.Cmd
55+
56+
switch msg := msg.(type) {
57+
case tea.KeyMsg:
58+
switch msg.String() {
59+
case "esc":
60+
return m, backMsg
61+
}
62+
case LoadDone:
63+
if msg.err != nil {
64+
m.err = msg.err
65+
} else {
66+
m.data = msg.data
67+
rows := generateRows(msg.data)
68+
m.table.SetHeight(len(rows))
69+
m.table.SetRows(rows)
70+
}
71+
}
72+
73+
m.table, cmd = m.table.Update(msg)
74+
75+
return m, cmd
76+
}
77+
78+
func (m model) View() string {
79+
if m.err != nil {
80+
return m.styles.Paragraph.Render(m.err.Error())
81+
}
82+
83+
return m.table.View()
84+
}
85+
86+
func LoadResults(year, driverID string) tea.Cmd {
87+
return func() tea.Msg {
88+
results, err := api.GetDriverRaceResults(year, driverID)
89+
return LoadDone{data: results, err: err}
90+
}
91+
}
92+
93+
func generateRows(data *api.RaceTable) []table.Row {
94+
rows := make([]table.Row, len(data.Races))
95+
for i, race := range data.Races {
96+
rows[i] = table.Row{
97+
race.Round,
98+
race.RaceName,
99+
race.Results[0].PositionText,
100+
race.Results[0].Points,
101+
race.Results[0].Status,
102+
}
103+
}
104+
return rows
105+
}
106+
107+
func backMsg() tea.Msg {
108+
return BackMsg{}
109+
}

internal/ui/program/program.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
tea "github.com/charmbracelet/bubbletea"
77

88
"github.com/acifani/formula1-go/internal/ui"
9+
"github.com/acifani/formula1-go/internal/ui/driver"
910
"github.com/acifani/formula1-go/internal/ui/page"
1011
"github.com/acifani/formula1-go/internal/ui/quali"
1112
"github.com/acifani/formula1-go/internal/ui/results"
@@ -20,6 +21,7 @@ const (
2021
PageWDC = iota
2122
PageSeason = iota
2223
PageQuali = iota
24+
PageDriver = iota
2325
)
2426

2527
type Page = int8
@@ -48,6 +50,7 @@ func (m *model) Init() tea.Cmd {
4850
PageWDC: wdc.New(m.styles),
4951
PageSeason: season.New(m.styles),
5052
PageQuali: quali.New(m.styles),
53+
PageDriver: driver.New(m.styles),
5154
}
5255

5356
return m.getCurrentPageModel().Init()
@@ -81,9 +84,13 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
8184
m.currentPage = PageResults
8285
case quali.LoadDone:
8386
m.currentPage = PageQuali
87+
case driver.LoadDone:
88+
m.currentPage = PageDriver
8489
case results.BackMsg, quali.BackMsg:
8590
m.currentPage = PageSeason
8691
cmds = append(cmds, m.getCurrentPageModel().Init())
92+
case driver.BackMsg:
93+
m.currentPage = PageResults
8794
}
8895

8996
currentPageModel := m.getCurrentPageModel()

internal/ui/results/results.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
tea "github.com/charmbracelet/bubbletea"
66

77
"github.com/acifani/formula1-go/internal/ui"
8+
"github.com/acifani/formula1-go/internal/ui/driver"
89
"github.com/acifani/formula1-go/internal/ui/page"
910
"github.com/acifani/formula1-go/internal/ui/quali"
1011
"github.com/acifani/formula1-go/pkg/api"
@@ -33,8 +34,8 @@ func New(styles ui.Styles) page.Model {
3334
{Title: "Time", Width: 12},
3435
{Title: "Pts", Width: 4},
3536
}
36-
t := table.New(table.WithColumns(columns))
37-
t.SetStyles(styles.Table)
37+
t := table.New(table.WithColumns(columns), table.WithFocused(true))
38+
t.SetStyles(styles.SelectableTable)
3839

3940
return &model{table: t, styles: styles}
4041
}
@@ -62,6 +63,12 @@ func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
6263
if m.data != nil {
6364
return m, quali.LoadResults(m.data.Season, m.data.Round)
6465
}
66+
case "enter":
67+
if m.data != nil {
68+
idx := m.table.Cursor()
69+
driverID := m.data.Races[0].Results[idx].Driver.DriverID
70+
return m, driver.LoadResults(m.data.Season, driverID)
71+
}
6572
}
6673
case LoadDone:
6774
if msg.err != nil {

internal/ui/wdc/wdc.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package wdc
22

33
import (
4+
"github.com/charmbracelet/bubbles/table"
5+
tea "github.com/charmbracelet/bubbletea"
6+
47
"github.com/acifani/formula1-go/internal/ui"
8+
"github.com/acifani/formula1-go/internal/ui/driver"
59
"github.com/acifani/formula1-go/internal/ui/page"
610
"github.com/acifani/formula1-go/pkg/api"
7-
"github.com/charmbracelet/bubbles/table"
8-
tea "github.com/charmbracelet/bubbletea"
911
)
1012

1113
type model struct {
14+
data *api.DriverStandingsTable
1215
table table.Model
1316
styles ui.Styles
1417
err error
@@ -27,8 +30,8 @@ func New(styles ui.Styles) page.Model {
2730
{Title: "Pts", Width: 4},
2831
{Title: "Wins", Width: 4},
2932
}
30-
t := table.New(table.WithColumns(columns))
31-
t.SetStyles(styles.Table)
33+
t := table.New(table.WithColumns(columns), table.WithFocused(true))
34+
t.SetStyles(styles.SelectableTable)
3235

3336
return &model{table: t, styles: styles}
3437
}
@@ -44,10 +47,20 @@ func (m model) Init() tea.Cmd {
4447
func (m model) Update(msg tea.Msg) (page.Model, tea.Cmd) {
4548
var cmd tea.Cmd
4649
switch msg := msg.(type) {
50+
case tea.KeyMsg:
51+
switch msg.String() {
52+
case "enter":
53+
if m.data != nil {
54+
idx := m.table.Cursor()
55+
driverID := m.data.StandingsLists[0].DriverStandings[idx].Driver.DriverID
56+
return m, driver.LoadResults(m.data.Season, driverID)
57+
}
58+
}
4759
case fetchDone:
4860
if msg.err != nil {
4961
m.err = msg.err
5062
} else {
63+
m.data = msg.data
5164
rows := generateRows(msg.data)
5265
m.table.SetHeight(len(rows))
5366
m.table.SetRows(rows)

pkg/api/ergast.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ func GetQualifyingResult(year, round string) (*QualifyingTable, error) {
6262
return &result.MRData.RaceTable, nil
6363
}
6464

65+
func GetDriverRaceResults(year, driverID string) (*RaceTable, error) {
66+
result := RaceResultResponse{}
67+
err := apiCall(fmt.Sprintf("/%s/drivers/%s/results.json", year, driverID), &result)
68+
if err != nil {
69+
return nil, err
70+
}
71+
return &result.MRData.RaceTable, nil
72+
}
73+
6574
func apiCall(url string, v interface{}) error {
6675
res, err := http.Get(baseURL + url)
6776
if err != nil {

0 commit comments

Comments
 (0)