@@ -3,6 +3,7 @@ package cmd
33import (
44 "fmt"
55 "os"
6+ "strings"
67
78 "github.com/charmbracelet/bubbles/list"
89 "github.com/charmbracelet/bubbles/spinner"
@@ -11,14 +12,11 @@ import (
1112 "github.com/S1ro1/popcorn-cli/src/models"
1213 "github.com/S1ro1/popcorn-cli/src/service"
1314
15+ "github.com/S1ro1/popcorn-cli/src/utils"
16+
1417 tea "github.com/charmbracelet/bubbletea"
1518)
1619
17- var runnerItems = []list.Item {
18- models.RunnerItem {TitleText : "Modal" , DescriptionText : "Submit a solution to be evaluated on Modal runners." , Value : "modal" },
19- models.RunnerItem {TitleText : "Github" , DescriptionText : "Submit a solution to be evaluated on Github runners. This can take a little longer to spin up." , Value : "github" },
20- }
21-
2220var submissionModeItems = []list.Item {
2321 models.SubmissionModeItem {TitleText : "Test" , DescriptionText : "Test the solution and give detailed results about passed/failed tests." , Value : "test" },
2422 models.SubmissionModeItem {TitleText : "Benchmark" , DescriptionText : "Benchmark the solution, this also runs the tests and afterwards runs the benchmark, returning detailed timing results" , Value : "benchmark" },
@@ -35,8 +33,6 @@ type model struct {
3533 filepath string
3634 leaderboardsList list.Model
3735 selectedLeaderboard string
38- runnersList list.Model
39- selectedRunner string
4036 gpusList list.Model
4137 selectedGpu string
4238 submissionModeList list.Model
@@ -58,6 +54,17 @@ func (m model) Init() tea.Cmd {
5854func (m model ) Update (msg tea.Msg ) (tea.Model , tea.Cmd ) {
5955 var cmd tea.Cmd
6056
57+ if len (m .gpusList .Items ()) == 0 && m .modalState == models .ModelStateGpuSelection {
58+ gpus , err := service .GetListItems (func () ([]models.GpuItem , error ) {
59+ return service .FetchAvailableGpus (m .selectedLeaderboard )
60+ })
61+ if err != nil {
62+ m .SetError (fmt .Sprintf ("Error fetching GPUs: %s" , err ))
63+ return m , tea .Quit
64+ }
65+ m .gpusList = list .New (gpus , list .NewDefaultDelegate (), m .width - 2 , m .height - 2 )
66+ m .gpusList .SetSize (m .width - 2 , m .height - 2 )
67+ }
6168 if ! m .finishedOkay {
6269 return m , tea .Quit
6370 }
@@ -72,25 +79,26 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7279 case models .ModelStateLeaderboardSelection :
7380 if i := m .leaderboardsList .SelectedItem (); i != nil {
7481 m .selectedLeaderboard = i .(models.LeaderboardItem ).TitleText
75- m .modalState = models .ModelStateRunnerSelection
76- m .runnersList .SetSize (m .width - 2 , m .height - 2 )
77- }
78- case models .ModelStateRunnerSelection :
79- if i := m .runnersList .SelectedItem (); i != nil {
80- m .selectedRunner = i .(models.RunnerItem ).Value
81- m .modalState = models .ModelStateGpuSelection
82- gpus , err := service .GetListItems (func () ([]models.GpuItem , error ) {
83- return service .FetchAvailableGpus (m .selectedLeaderboard , m .selectedRunner )
84- })
85- if err != nil {
86- m .SetError (fmt .Sprintf ("Error fetching GPUs: %s" , err ))
87- return m , tea .Quit
82+ // No gpu selected in popcorn directives, fetch gpus and move to gpu selection
83+ if m .selectedGpu == "" {
84+ gpus , err := service .GetListItems (func () ([]models.GpuItem , error ) {
85+ return service .FetchAvailableGpus (m .selectedLeaderboard )
86+ })
87+ if err != nil {
88+ m .SetError (fmt .Sprintf ("Error fetching GPUs: %s" , err ))
89+ return m , tea .Quit
90+ }
91+ if len (gpus ) == 0 {
92+ m .SetError ("No GPUs available for this leaderboard." )
93+ return m , tea .Quit
94+ }
95+ m .gpusList = list .New (gpus , list .NewDefaultDelegate (), m .width - 2 , m .height - 2 )
96+ m .gpusList .SetSize (m .width - 2 , m .height - 2 )
97+ m .modalState = models .ModelStateGpuSelection
98+ } else {
99+ m .modalState = models .ModelStateSubmissionModeSelection
100+ m .submissionModeList .SetSize (m .width - 2 , m .height - 2 )
88101 }
89- if len (gpus ) == 0 {
90- m .SetError ("No GPUs available for this runner and leaderboard." )
91- return m , tea .Quit
92- }
93- m .gpusList = list .New (gpus , list .NewDefaultDelegate (), m .width - 2 , m .height - 2 )
94102 }
95103 case models .ModelStateGpuSelection :
96104 if i := m .gpusList .SelectedItem (); i != nil {
@@ -119,8 +127,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
119127 switch m .modalState {
120128 case models .ModelStateLeaderboardSelection :
121129 m .leaderboardsList .SetSize (listWidth , listHeight )
122- case models .ModelStateRunnerSelection :
123- m .runnersList .SetSize (listWidth , listHeight )
124130 case models .ModelStateGpuSelection :
125131 m .gpusList .SetSize (listWidth , listHeight )
126132 case models .ModelStateSubmissionModeSelection :
@@ -131,8 +137,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
131137 switch m .modalState {
132138 case models .ModelStateLeaderboardSelection :
133139 m .leaderboardsList , cmd = m .leaderboardsList .Update (msg )
134- case models .ModelStateRunnerSelection :
135- m .runnersList , cmd = m .runnersList .Update (msg )
136140 case models .ModelStateGpuSelection :
137141 m .gpusList , cmd = m .gpusList .Update (msg )
138142 case models .ModelStateSubmissionModeSelection :
@@ -159,8 +163,6 @@ func (m model) View() string {
159163 switch m .modalState {
160164 case models .ModelStateLeaderboardSelection :
161165 content = m .leaderboardsList .View ()
162- case models .ModelStateRunnerSelection :
163- content = m .runnersList .View ()
164166 case models .ModelStateGpuSelection :
165167 content = m .gpusList .View ()
166168 case models .ModelStateSubmissionModeSelection :
@@ -182,12 +184,14 @@ func (m model) Submit() tea.Cmd {
182184 go func () {
183185 fileContent , err := os .ReadFile (m .filepath )
184186 if err != nil {
187+ p .Send (models.ErrorMsg {Err : fmt .Errorf ("error reading file: %s" , err )})
185188 m .SetError (fmt .Sprintf ("Error reading file: %s" , err ))
186189 return
187190 }
188191
189- prettyResult , err := service .SubmitSolution (m .selectedLeaderboard , m .selectedRunner , m . selectedGpu , m .selectedSubmissionMode , m .filepath , fileContent )
192+ prettyResult , err := service .SubmitSolution (m .selectedLeaderboard , m .selectedGpu , m .selectedSubmissionMode , m .filepath , fileContent )
190193 if err != nil {
194+ p .Send (models.ErrorMsg {Err : fmt .Errorf ("error submitting solution: %s" , err )})
191195 m .SetError (fmt .Sprintf ("Error submitting solution: %s" , err ))
192196 return
193197 }
@@ -213,28 +217,53 @@ func Execute() {
213217 return
214218 }
215219
220+ popcornDirectives , err := utils .GetPopcornDirectives (filepath )
221+ if err != nil {
222+ fmt .Println ("Error:" , err )
223+ var input string
224+ fmt .Scanln (& input )
225+ if strings .ToLower (input ) != "y" {
226+ return
227+ }
228+ }
229+
230+ var modalState models.ModelState
231+ if popcornDirectives .LeaderboardName != "" && len (popcornDirectives .Gpus ) > 0 {
232+ modalState = models .ModelStateSubmissionModeSelection
233+ } else if popcornDirectives .LeaderboardName != "" {
234+ modalState = models .ModelStateGpuSelection
235+ } else {
236+ modalState = models .ModelStateLeaderboardSelection
237+ }
238+
239+ var selectedGpu string
240+ if len (popcornDirectives .Gpus ) > 0 {
241+ selectedGpu = popcornDirectives .Gpus [0 ]
242+ }
243+
216244 leaderboardItems , err := service .GetListItems (service .FetchLeaderboards )
217245 if err != nil {
218246 fmt .Println ("Error fetching leaderboards:" , err )
219- return
247+
220248 }
221249
222250 s := spinner .New ()
223251 s .Spinner = spinner .Dot
224252 s .Style = lipgloss .NewStyle ().Foreground (lipgloss .Color ("205" ))
225253
226254 m := model {
227- filepath : filepath ,
228- leaderboardsList : list .New (leaderboardItems , list .NewDefaultDelegate (), 0 , 0 ),
229- runnersList : list .New (runnerItems , list .NewDefaultDelegate (), 0 , 0 ),
230- submissionModeList : list .New (submissionModeItems , list .NewDefaultDelegate (), 0 , 0 ),
231- spinner : s ,
232- modalState : models .ModelStateLeaderboardSelection ,
233- finishedOkay : true ,
234- finalStatus : "" ,
255+ filepath : filepath ,
256+ leaderboardsList : list .New (leaderboardItems , list .NewDefaultDelegate (), 0 , 0 ),
257+ submissionModeList : list .New (submissionModeItems , list .NewDefaultDelegate (), 0 , 0 ),
258+ gpusList : list .New ([]list.Item {}, list .NewDefaultDelegate (), 0 , 0 ),
259+ spinner : s ,
260+ modalState : modalState ,
261+ finishedOkay : true ,
262+ finalStatus : "" ,
263+ selectedLeaderboard : popcornDirectives .LeaderboardName ,
264+ selectedGpu : selectedGpu ,
235265 }
236266 m .leaderboardsList .Title = "Leaderboards"
237- m .runnersList .Title = "Runners"
238267
239268 p = tea .NewProgram (m )
240269 finalModel , err := p .Run ()
@@ -244,6 +273,7 @@ func Execute() {
244273 }
245274
246275 m , ok := finalModel .(model )
276+ utils .DisplayAsciiArt ()
247277 if ok && m .finishedOkay {
248278 fmt .Printf ("\n Result:\n \n %s\n " , m .finalStatus )
249279 } else if ok && ! m .finishedOkay {
0 commit comments