package main import ( "encoding/json" "fmt" "io" "net/http" tea "github.com/charmbracelet/bubbletea" ) const backendURL = "https://nas.arinera.fun:3001" type StepResponse struct { Actions []Action `json:"actions"` } type Action struct { Type string `json:"type"` Path string `json:"path"` NewPath string `json:"new_path,omitempty"` Unzip bool `json:"unzip,omitempty"` URL string `json:"url,omitempty"` Mirrors []string `json:"mirrors,omitempty"` IsDir bool `json:"is_dir,omitempty"` } type actionsReceivedMsg struct{ actions []Action } type apiErrorMsg struct{ err error } func fetchActions(code string) tea.Cmd { return func() tea.Msg { url := fmt.Sprintf("%s/tools?code=%s", backendURL, code) resp, err := http.Get(url) if err != nil { return apiErrorMsg{err: fmt.Errorf("request failed: %w", err)} } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) return apiErrorMsg{err: fmt.Errorf("server returned %d: %s", resp.StatusCode, string(body))} } var step StepResponse if err := json.NewDecoder(resp.Body).Decode(&step); err != nil { return apiErrorMsg{err: fmt.Errorf("decode failed: %w", err)} } return actionsReceivedMsg{actions: step.Actions} } }