package updates import ( "encoding/json" "strings" ) // winUpdate is one row of the Windows Update searcher's output, in the shape // searchScript emits it. type winUpdate struct { Title string `json:"title"` KB string `json:"kb"` } // parseUpdateSearch reads the searcher's JSON. // // It carries no build tag on purpose: this is the half of the Windows update // path that can be tested on a development machine, and the agent module has no // Windows CI. func parseUpdateSearch(jsonText string) ([]PackageUpdate, error) { s := strings.TrimSpace(jsonText) if s == "" || s == "null" { return nil, nil } var rows []winUpdate if err := json.Unmarshal([]byte(s), &rows); err != nil { // ConvertTo-Json renders a one-element array as a bare object. var one winUpdate if err2 := json.Unmarshal([]byte(s), &one); err2 != nil { return nil, err } rows = []winUpdate{one} } out := make([]PackageUpdate, 0, len(rows)) for _, r := range rows { u := PackageUpdate{Name: r.Title} if kb := strings.TrimSpace(r.KB); kb != "" { if !strings.HasPrefix(strings.ToUpper(kb), "KB") { kb = "KB" + kb } u.NewVersion = kb } out = append(out, u) } return out, nil }