// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package govulncheck import ( "encoding/json" "io" "golang.org/x/vuln/internal/osv" ) // Handler handles messages to be presented in a vulnerability scan output // stream. type Handler interface { // Config communicates introductory message to the user. Config(config *Config) error // SBOM shows information about what govulncheck is scanning. SBOM(sbom *SBOM) error // Progress is called to display a progress message. Progress(progress *Progress) error // OSV is invoked for each osv Entry in the stream. OSV(entry *osv.Entry) error // Finding is called for each vulnerability finding in the stream. Finding(finding *Finding) error } // HandleJSON reads the json from the supplied stream and hands the decoded // output to the handler. func HandleJSON(from io.Reader, to Handler) error { dec := json.NewDecoder(from) for dec.More() { msg := Message{} // decode the next message in the stream if err := dec.Decode(&msg); err != nil { return err } // dispatch the message var err error if msg.Config != nil { err = to.Config(msg.Config) } if msg.Progress != nil { err = to.Progress(msg.Progress) } if msg.SBOM != nil { err = to.SBOM(msg.SBOM) } if msg.OSV != nil { err = to.OSV(msg.OSV) } if msg.Finding != nil { err = to.Finding(msg.Finding) } if err != nil { return err } } return nil }