package main import ( "encoding/json" "net/http" "strconv" ) func mountBatteryAPI(mux *http.ServeMux, link *managedSerial) { mux.HandleFunc("/api/battery", func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: serveBatteryGet(w, r, link) case http.MethodPost: serveBatteryPost(w, r, link) default: http.Error(w, "method not allowed", http.StatusMethodNotAllowed) } }) } func serveBatteryGet(w http.ResponseWriter, r *http.Request, link *managedSerial) { req := batteryAPIRequest{} if v := r.URL.Query().Get("all_clients"); v == "1" || v == "true" { req.AllClients = true } if s := r.URL.Query().Get("client_id"); s != "" { id, err := strconv.ParseUint(s, 10, 32) if err != nil { writeJSON(w, http.StatusBadRequest, batteryAPIResponse{Error: "invalid client_id"}) return } req.ClientID = uint32(id) } else if !req.AllClients { req.AllClients = true } out := applyBatteryStatus(link, req) status := http.StatusOK if out.Error != "" || !out.Success { status = http.StatusServiceUnavailable } writeJSON(w, status, out) } func serveBatteryPost(w http.ResponseWriter, r *http.Request, link *managedSerial) { var body batteryAPIRequest if err := json.NewDecoder(r.Body).Decode(&body); err != nil { writeJSON(w, http.StatusBadRequest, batteryAPIResponse{Error: "invalid JSON"}) return } if !body.AllClients && body.ClientID == 0 { body.AllClients = true } out := applyBatteryStatus(link, body) status := http.StatusOK if out.Error != "" || !out.Success { status = http.StatusServiceUnavailable } writeJSON(w, status, out) }