diff --git a/csaf/providermetaloader.go b/csaf/providermetaloader.go index 490c9a7..4924aa0 100644 --- a/csaf/providermetaloader.go +++ b/csaf/providermetaloader.go @@ -23,6 +23,25 @@ type ProviderMetadataLoader struct { logging func(string, ...any) } +// ProviderMetadataLoadMessageType is the type of the message. +type ProviderMetadataLoadMessageType int + +const ( + //JSONDecodingFailed indicates problems with JSON decoding + JSONDecodingFailed ProviderMetadataLoadMessageType = iota + // SchemaValidationFailed indicates a general problem with schema validation. + SchemaValidationFailed + // SchemaValidationFailedDetail is a failure detail in schema validation. + SchemaValidationFailedDetail +) + +// ProviderMetadataLoadMessage is a message generated while loading +// a provider meta data file. +type ProviderMetadataLoadMessage struct { + Type ProviderMetadataLoadMessageType + Message string +} + // LoadedProviderMetadata represents a loaded provider metadata. type LoadedProviderMetadata struct { // URL is location where the document was found. @@ -32,7 +51,7 @@ type LoadedProviderMetadata struct { // Hash is a SHA256 sum over the document. Hash []byte // Messages are the error message happened while loading. - Messages []string + Messages []ProviderMetadataLoadMessage } // Valid returns true if the loaded document is valid. diff --git a/csaf/util.go b/csaf/util.go index ecef653..0abe7c2 100644 --- a/csaf/util.go +++ b/csaf/util.go @@ -93,21 +93,31 @@ func loadProviderMetadataFromURL( // We have loaded it the first time. if err != nil { - result.Messages = []string{fmt.Sprintf("%s: Decoding JSON failed: %v", url, err)} + result.Messages = []ProviderMetadataLoadMessage{{ + Type: JSONDecodingFailed, + Message: fmt.Sprintf("%s: Decoding JSON failed: %v", url, err), + }} storeLoaded() return &result } switch errors, err := ValidateProviderMetadata(doc); { case err != nil: - result.Messages = []string{ - fmt.Sprintf("%s: Validating against JSON schema failed: %v", url, err)} + result.Messages = []ProviderMetadataLoadMessage{{ + Type: SchemaValidationFailed, + Message: fmt.Sprintf("%s: Validating against JSON schema failed: %v", url, err), + }} case len(errors) > 0: - result.Messages = []string{ - fmt.Sprintf("%s: Validating against JSON schema failed: %v", url, err)} + result.Messages = []ProviderMetadataLoadMessage{{ + Type: SchemaValidationFailed, + Message: fmt.Sprintf("%s: Validating against JSON schema failed: %v", url, err), + }} for _, msg := range errors { - result.Messages = append(result.Messages, strings.ReplaceAll(msg, `%`, `%%`)) + result.Messages = append(result.Messages, ProviderMetadataLoadMessage{ + Type: SchemaValidationFailedDetail, + Message: strings.ReplaceAll(msg, `%`, `%%`), + }) } default: // Only store in result if validation passed. @@ -193,7 +203,7 @@ func LoadProviderMetadataForDomain( } alreadyLogged[result] = url for _, msg := range result.Messages { - logging(msg) + logging(msg.Message) } }