services/google/containeranalysis/alpha/note_internal.go (6,946 lines of code) (raw):

// Copyright 2025 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package alpha import ( "bytes" "context" "encoding/json" "fmt" "io/ioutil" "strings" "github.com/GoogleCloudPlatform/declarative-resource-client-library/dcl" ) func (r *Note) validate() error { if err := dcl.ValidateExactlyOneOfFieldsSet([]string{"Vulnerability", "Build", "Image", "Package", "Deployment", "Discovery", "Attestation"}, r.Vulnerability, r.Build, r.Image, r.Package, r.Deployment, r.Discovery, r.Attestation); err != nil { return err } if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.RequiredParameter(r.Project, "Project"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.Vulnerability) { if err := r.Vulnerability.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Build) { if err := r.Build.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Image) { if err := r.Image.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Package) { if err := r.Package.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Discovery) { if err := r.Discovery.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Deployment) { if err := r.Deployment.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.Attestation) { if err := r.Attestation.validate(); err != nil { return err } } return nil } func (r *NoteRelatedUrl) validate() error { return nil } func (r *NoteVulnerability) validate() error { if !dcl.IsEmptyValueIndirect(r.CvssV3) { if err := r.CvssV3.validate(); err != nil { return err } } return nil } func (r *NoteVulnerabilityDetails) validate() error { if err := dcl.Required(r, "affectedCpeUri"); err != nil { return err } if err := dcl.Required(r, "affectedPackage"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.AffectedVersionStart) { if err := r.AffectedVersionStart.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.AffectedVersionEnd) { if err := r.AffectedVersionEnd.validate(); err != nil { return err } } if !dcl.IsEmptyValueIndirect(r.FixedVersion) { if err := r.FixedVersion.validate(); err != nil { return err } } return nil } func (r *NoteVulnerabilityDetailsAffectedVersionStart) validate() error { if err := dcl.Required(r, "kind"); err != nil { return err } return nil } func (r *NoteVulnerabilityDetailsAffectedVersionEnd) validate() error { if err := dcl.Required(r, "kind"); err != nil { return err } return nil } func (r *NoteVulnerabilityDetailsFixedVersion) validate() error { if err := dcl.Required(r, "kind"); err != nil { return err } return nil } func (r *NoteVulnerabilityCvssV3) validate() error { return nil } func (r *NoteVulnerabilityWindowsDetails) validate() error { if err := dcl.Required(r, "cpeUri"); err != nil { return err } if err := dcl.Required(r, "name"); err != nil { return err } if err := dcl.Required(r, "fixingKbs"); err != nil { return err } return nil } func (r *NoteVulnerabilityWindowsDetailsFixingKbs) validate() error { return nil } func (r *NoteBuild) validate() error { if err := dcl.Required(r, "builderVersion"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.Signature) { if err := r.Signature.validate(); err != nil { return err } } return nil } func (r *NoteBuildSignature) validate() error { if err := dcl.Required(r, "signature"); err != nil { return err } return nil } func (r *NoteImage) validate() error { if err := dcl.Required(r, "resourceUrl"); err != nil { return err } if err := dcl.Required(r, "fingerprint"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.Fingerprint) { if err := r.Fingerprint.validate(); err != nil { return err } } return nil } func (r *NoteImageFingerprint) validate() error { if err := dcl.Required(r, "v1Name"); err != nil { return err } if err := dcl.Required(r, "v2Blob"); err != nil { return err } return nil } func (r *NotePackage) validate() error { if err := dcl.Required(r, "name"); err != nil { return err } return nil } func (r *NotePackageDistribution) validate() error { if err := dcl.Required(r, "cpeUri"); err != nil { return err } if !dcl.IsEmptyValueIndirect(r.LatestVersion) { if err := r.LatestVersion.validate(); err != nil { return err } } return nil } func (r *NotePackageDistributionLatestVersion) validate() error { if err := dcl.Required(r, "kind"); err != nil { return err } return nil } func (r *NoteDiscovery) validate() error { if err := dcl.Required(r, "analysisKind"); err != nil { return err } return nil } func (r *NoteDeployment) validate() error { if err := dcl.Required(r, "resourceUri"); err != nil { return err } return nil } func (r *NoteAttestation) validate() error { if !dcl.IsEmptyValueIndirect(r.Hint) { if err := r.Hint.validate(); err != nil { return err } } return nil } func (r *NoteAttestationHint) validate() error { if err := dcl.Required(r, "humanReadableName"); err != nil { return err } return nil } func (r *Note) basePath() string { params := map[string]interface{}{} return dcl.Nprintf("https://containeranalysis.googleapis.com/v1alpha1/", params) } func (r *Note) getURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/notes/{{name}}", nr.basePath(), userBasePath, params), nil } func (r *Note) listURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), } return dcl.URL("projects/{{project}}/notes", nr.basePath(), userBasePath, params), nil } func (r *Note) createURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/notes?noteId={{name}}", nr.basePath(), userBasePath, params), nil } func (r *Note) deleteURL(userBasePath string) (string, error) { nr := r.urlNormalized() params := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/notes/{{name}}", nr.basePath(), userBasePath, params), nil } // noteApiOperation represents a mutable operation in the underlying REST // API such as Create, Update, or Delete. type noteApiOperation interface { do(context.Context, *Note, *Client) error } // newUpdateNoteUpdateNoteRequest creates a request for an // Note resource's UpdateNote update type by filling in the update // fields based on the intended state of the resource. func newUpdateNoteUpdateNoteRequest(ctx context.Context, f *Note, c *Client) (map[string]interface{}, error) { req := map[string]interface{}{} res := f _ = res if v := f.ShortDescription; !dcl.IsEmptyValueIndirect(v) { req["shortDescription"] = v } if v := f.LongDescription; !dcl.IsEmptyValueIndirect(v) { req["longDescription"] = v } if v, err := expandNoteRelatedUrlSlice(c, f.RelatedUrl, res); err != nil { return nil, fmt.Errorf("error expanding RelatedUrl into relatedUrl: %w", err) } else if v != nil { req["relatedUrl"] = v } if v := f.ExpirationTime; !dcl.IsEmptyValueIndirect(v) { req["expirationTime"] = v } if v := f.RelatedNoteNames; v != nil { req["relatedNoteNames"] = v } if v, err := expandNoteVulnerability(c, f.Vulnerability, res); err != nil { return nil, fmt.Errorf("error expanding Vulnerability into vulnerability: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["vulnerability"] = v } if v, err := expandNoteBuild(c, f.Build, res); err != nil { return nil, fmt.Errorf("error expanding Build into build: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["build"] = v } if v, err := expandNoteImage(c, f.Image, res); err != nil { return nil, fmt.Errorf("error expanding Image into image: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["image"] = v } if v, err := expandNotePackage(c, f.Package, res); err != nil { return nil, fmt.Errorf("error expanding Package into package: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["package"] = v } if v, err := expandNoteDiscovery(c, f.Discovery, res); err != nil { return nil, fmt.Errorf("error expanding Discovery into discovery: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["discovery"] = v } if v, err := expandNoteDeployment(c, f.Deployment, res); err != nil { return nil, fmt.Errorf("error expanding Deployment into deployment: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["deployment"] = v } if v, err := expandNoteAttestation(c, f.Attestation, res); err != nil { return nil, fmt.Errorf("error expanding Attestation into attestation: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { req["attestation"] = v } return req, nil } // marshalUpdateNoteUpdateNoteRequest converts the update into // the final JSON request body. func marshalUpdateNoteUpdateNoteRequest(c *Client, m map[string]interface{}) ([]byte, error) { return json.Marshal(m) } type updateNoteUpdateNoteOperation struct { // If the update operation has the REQUIRES_APPLY_OPTIONS trait, this will be populated. // Usually it will be nil - this is to prevent us from accidentally depending on apply // options, which should usually be unnecessary. ApplyOptions []dcl.ApplyOption FieldDiffs []*dcl.FieldDiff } // do creates a request and sends it to the appropriate URL. In most operations, // do will transcribe a subset of the resource into a request object and send a // PUT request to a single URL. func (op *updateNoteUpdateNoteOperation) do(ctx context.Context, r *Note, c *Client) error { _, err := c.GetNote(ctx, r) if err != nil { return err } u, err := r.updateURL(c.Config.BasePath, "UpdateNote") if err != nil { return err } req, err := newUpdateNoteUpdateNoteRequest(ctx, r, c) if err != nil { return err } c.Config.Logger.InfoWithContextf(ctx, "Created update: %#v", req) body, err := marshalUpdateNoteUpdateNoteRequest(c, req) if err != nil { return err } _, err = dcl.SendRequest(ctx, c.Config, "PATCH", u, bytes.NewBuffer(body), c.Config.RetryProvider) if err != nil { return err } return nil } func (c *Client) listNoteRaw(ctx context.Context, r *Note, pageToken string, pageSize int32) ([]byte, error) { u, err := r.urlNormalized().listURL(c.Config.BasePath) if err != nil { return nil, err } m := make(map[string]string) if pageToken != "" { m["pageToken"] = pageToken } if pageSize != NoteMaxPage { m["pageSize"] = fmt.Sprintf("%v", pageSize) } u, err = dcl.AddQueryParams(u, m) if err != nil { return nil, err } resp, err := dcl.SendRequest(ctx, c.Config, "GET", u, &bytes.Buffer{}, c.Config.RetryProvider) if err != nil { return nil, err } defer resp.Response.Body.Close() return ioutil.ReadAll(resp.Response.Body) } type listNoteOperation struct { Notes []map[string]interface{} `json:"notes"` Token string `json:"nextPageToken"` } func (c *Client) listNote(ctx context.Context, r *Note, pageToken string, pageSize int32) ([]*Note, string, error) { b, err := c.listNoteRaw(ctx, r, pageToken, pageSize) if err != nil { return nil, "", err } var m listNoteOperation if err := json.Unmarshal(b, &m); err != nil { return nil, "", err } var l []*Note for _, v := range m.Notes { res, err := unmarshalMapNote(v, c, r) if err != nil { return nil, m.Token, err } res.Project = r.Project l = append(l, res) } return l, m.Token, nil } func (c *Client) deleteAllNote(ctx context.Context, f func(*Note) bool, resources []*Note) error { var errors []string for _, res := range resources { if f(res) { // We do not want deleteAll to fail on a deletion or else it will stop deleting other resources. err := c.DeleteNote(ctx, res) if err != nil { errors = append(errors, err.Error()) } } } if len(errors) > 0 { return fmt.Errorf("%v", strings.Join(errors, "\n")) } else { return nil } } type deleteNoteOperation struct{} func (op *deleteNoteOperation) do(ctx context.Context, r *Note, c *Client) error { r, err := c.GetNote(ctx, r) if err != nil { if dcl.IsNotFound(err) { c.Config.Logger.InfoWithContextf(ctx, "Note not found, returning. Original error: %v", err) return nil } c.Config.Logger.WarningWithContextf(ctx, "GetNote checking for existence. error: %v", err) return err } u, err := r.deleteURL(c.Config.BasePath) if err != nil { return err } // Delete should never have a body body := &bytes.Buffer{} _, err = dcl.SendRequest(ctx, c.Config, "DELETE", u, body, c.Config.RetryProvider) if err != nil { return fmt.Errorf("failed to delete Note: %w", err) } // We saw a race condition where for some successful delete operation, the Get calls returned resources for a short duration. // This is the reason we are adding retry to handle that case. retriesRemaining := 10 dcl.Do(ctx, func(ctx context.Context) (*dcl.RetryDetails, error) { _, err := c.GetNote(ctx, r) if dcl.IsNotFound(err) { return nil, nil } if retriesRemaining > 0 { retriesRemaining-- return &dcl.RetryDetails{}, dcl.OperationNotDone{} } return nil, dcl.NotDeletedError{ExistingResource: r} }, c.Config.RetryProvider) return nil } // Create operations are similar to Update operations, although they do not have // specific request objects. The Create request object is the json encoding of // the resource, which is modified by res.marshal to form the base request body. type createNoteOperation struct { response map[string]interface{} } func (op *createNoteOperation) FirstResponse() (map[string]interface{}, bool) { return op.response, len(op.response) > 0 } func (op *createNoteOperation) do(ctx context.Context, r *Note, c *Client) error { c.Config.Logger.InfoWithContextf(ctx, "Attempting to create %v", r) u, err := r.createURL(c.Config.BasePath) if err != nil { return err } req, err := r.marshal(c) if err != nil { return err } resp, err := dcl.SendRequest(ctx, c.Config, "POST", u, bytes.NewBuffer(req), c.Config.RetryProvider) if err != nil { return err } o, err := dcl.ResponseBodyAsJSON(resp) if err != nil { return fmt.Errorf("error decoding response body into JSON: %w", err) } op.response = o if _, err := c.GetNote(ctx, r); err != nil { c.Config.Logger.WarningWithContextf(ctx, "get returned error: %v", err) return err } return nil } func (c *Client) getNoteRaw(ctx context.Context, r *Note) ([]byte, error) { u, err := r.getURL(c.Config.BasePath) if err != nil { return nil, err } resp, err := dcl.SendRequest(ctx, c.Config, "GET", u, &bytes.Buffer{}, c.Config.RetryProvider) if err != nil { return nil, err } defer resp.Response.Body.Close() b, err := ioutil.ReadAll(resp.Response.Body) if err != nil { return nil, err } return b, nil } func (c *Client) noteDiffsForRawDesired(ctx context.Context, rawDesired *Note, opts ...dcl.ApplyOption) (initial, desired *Note, diffs []*dcl.FieldDiff, err error) { c.Config.Logger.InfoWithContext(ctx, "Fetching initial state...") // First, let us see if the user provided a state hint. If they did, we will start fetching based on that. var fetchState *Note if sh := dcl.FetchStateHint(opts); sh != nil { if r, ok := sh.(*Note); !ok { c.Config.Logger.WarningWithContextf(ctx, "Initial state hint was of the wrong type; expected Note, got %T", sh) } else { fetchState = r } } if fetchState == nil { fetchState = rawDesired } // 1.2: Retrieval of raw initial state from API rawInitial, err := c.GetNote(ctx, fetchState) if rawInitial == nil { if !dcl.IsNotFound(err) { c.Config.Logger.WarningWithContextf(ctx, "Failed to retrieve whether a Note resource already exists: %s", err) return nil, nil, nil, fmt.Errorf("failed to retrieve Note resource: %v", err) } c.Config.Logger.InfoWithContext(ctx, "Found that Note resource did not exist.") // Perform canonicalization to pick up defaults. desired, err = canonicalizeNoteDesiredState(rawDesired, rawInitial) return nil, desired, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Found initial state for Note: %v", rawInitial) c.Config.Logger.InfoWithContextf(ctx, "Initial desired state for Note: %v", rawDesired) // The Get call applies postReadExtract and so the result may contain fields that are not part of API version. if err := extractNoteFields(rawInitial); err != nil { return nil, nil, nil, err } // 1.3: Canonicalize raw initial state into initial state. initial, err = canonicalizeNoteInitialState(rawInitial, rawDesired) if err != nil { return nil, nil, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Canonicalized initial state for Note: %v", initial) // 1.4: Canonicalize raw desired state into desired state. desired, err = canonicalizeNoteDesiredState(rawDesired, rawInitial, opts...) if err != nil { return nil, nil, nil, err } c.Config.Logger.InfoWithContextf(ctx, "Canonicalized desired state for Note: %v", desired) // 2.1: Comparison of initial and desired state. diffs, err = diffNote(c, desired, initial, opts...) return initial, desired, diffs, err } func canonicalizeNoteInitialState(rawInitial, rawDesired *Note) (*Note, error) { // TODO(magic-modules-eng): write canonicalizer once relevant traits are added. if !dcl.IsZeroValue(rawInitial.Vulnerability) { // Check if anything else is set. if dcl.AnySet(rawInitial.Build, rawInitial.Image, rawInitial.Package, rawInitial.Deployment, rawInitial.Discovery, rawInitial.Attestation) { rawInitial.Vulnerability = EmptyNoteVulnerability } } if !dcl.IsZeroValue(rawInitial.Build) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Image, rawInitial.Package, rawInitial.Deployment, rawInitial.Discovery, rawInitial.Attestation) { rawInitial.Build = EmptyNoteBuild } } if !dcl.IsZeroValue(rawInitial.Image) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Build, rawInitial.Package, rawInitial.Deployment, rawInitial.Discovery, rawInitial.Attestation) { rawInitial.Image = EmptyNoteImage } } if !dcl.IsZeroValue(rawInitial.Package) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Build, rawInitial.Image, rawInitial.Deployment, rawInitial.Discovery, rawInitial.Attestation) { rawInitial.Package = EmptyNotePackage } } if !dcl.IsZeroValue(rawInitial.Deployment) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Build, rawInitial.Image, rawInitial.Package, rawInitial.Discovery, rawInitial.Attestation) { rawInitial.Deployment = EmptyNoteDeployment } } if !dcl.IsZeroValue(rawInitial.Discovery) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Build, rawInitial.Image, rawInitial.Package, rawInitial.Deployment, rawInitial.Attestation) { rawInitial.Discovery = EmptyNoteDiscovery } } if !dcl.IsZeroValue(rawInitial.Attestation) { // Check if anything else is set. if dcl.AnySet(rawInitial.Vulnerability, rawInitial.Build, rawInitial.Image, rawInitial.Package, rawInitial.Deployment, rawInitial.Discovery) { rawInitial.Attestation = EmptyNoteAttestation } } return rawInitial, nil } /* * Canonicalizers * * These are responsible for converting either a user-specified config or a * GCP API response to a standard format that can be used for difference checking. * */ func canonicalizeNoteDesiredState(rawDesired, rawInitial *Note, opts ...dcl.ApplyOption) (*Note, error) { if rawInitial == nil { // Since the initial state is empty, the desired state is all we have. // We canonicalize the remaining nested objects with nil to pick up defaults. rawDesired.Vulnerability = canonicalizeNoteVulnerability(rawDesired.Vulnerability, nil, opts...) rawDesired.Build = canonicalizeNoteBuild(rawDesired.Build, nil, opts...) rawDesired.Image = canonicalizeNoteImage(rawDesired.Image, nil, opts...) rawDesired.Package = canonicalizeNotePackage(rawDesired.Package, nil, opts...) rawDesired.Discovery = canonicalizeNoteDiscovery(rawDesired.Discovery, nil, opts...) rawDesired.Deployment = canonicalizeNoteDeployment(rawDesired.Deployment, nil, opts...) rawDesired.Attestation = canonicalizeNoteAttestation(rawDesired.Attestation, nil, opts...) return rawDesired, nil } canonicalDesired := &Note{} if dcl.PartialSelfLinkToSelfLink(rawDesired.Name, rawInitial.Name) { canonicalDesired.Name = rawInitial.Name } else { canonicalDesired.Name = rawDesired.Name } if dcl.StringCanonicalize(rawDesired.ShortDescription, rawInitial.ShortDescription) { canonicalDesired.ShortDescription = rawInitial.ShortDescription } else { canonicalDesired.ShortDescription = rawDesired.ShortDescription } if dcl.StringCanonicalize(rawDesired.LongDescription, rawInitial.LongDescription) { canonicalDesired.LongDescription = rawInitial.LongDescription } else { canonicalDesired.LongDescription = rawDesired.LongDescription } canonicalDesired.RelatedUrl = canonicalizeNoteRelatedUrlSlice(rawDesired.RelatedUrl, rawInitial.RelatedUrl, opts...) if dcl.IsZeroValue(rawDesired.ExpirationTime) || (dcl.IsEmptyValueIndirect(rawDesired.ExpirationTime) && dcl.IsEmptyValueIndirect(rawInitial.ExpirationTime)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. canonicalDesired.ExpirationTime = rawInitial.ExpirationTime } else { canonicalDesired.ExpirationTime = rawDesired.ExpirationTime } if dcl.StringArrayCanonicalize(rawDesired.RelatedNoteNames, rawInitial.RelatedNoteNames) { canonicalDesired.RelatedNoteNames = rawInitial.RelatedNoteNames } else { canonicalDesired.RelatedNoteNames = rawDesired.RelatedNoteNames } canonicalDesired.Vulnerability = canonicalizeNoteVulnerability(rawDesired.Vulnerability, rawInitial.Vulnerability, opts...) canonicalDesired.Build = canonicalizeNoteBuild(rawDesired.Build, rawInitial.Build, opts...) canonicalDesired.Image = canonicalizeNoteImage(rawDesired.Image, rawInitial.Image, opts...) canonicalDesired.Package = canonicalizeNotePackage(rawDesired.Package, rawInitial.Package, opts...) canonicalDesired.Discovery = canonicalizeNoteDiscovery(rawDesired.Discovery, rawInitial.Discovery, opts...) canonicalDesired.Deployment = canonicalizeNoteDeployment(rawDesired.Deployment, rawInitial.Deployment, opts...) canonicalDesired.Attestation = canonicalizeNoteAttestation(rawDesired.Attestation, rawInitial.Attestation, opts...) if dcl.NameToSelfLink(rawDesired.Project, rawInitial.Project) { canonicalDesired.Project = rawInitial.Project } else { canonicalDesired.Project = rawDesired.Project } if canonicalDesired.Vulnerability != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Build, rawDesired.Image, rawDesired.Package, rawDesired.Deployment, rawDesired.Discovery, rawDesired.Attestation) { canonicalDesired.Vulnerability = EmptyNoteVulnerability } } if canonicalDesired.Build != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Image, rawDesired.Package, rawDesired.Deployment, rawDesired.Discovery, rawDesired.Attestation) { canonicalDesired.Build = EmptyNoteBuild } } if canonicalDesired.Image != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Build, rawDesired.Package, rawDesired.Deployment, rawDesired.Discovery, rawDesired.Attestation) { canonicalDesired.Image = EmptyNoteImage } } if canonicalDesired.Package != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Build, rawDesired.Image, rawDesired.Deployment, rawDesired.Discovery, rawDesired.Attestation) { canonicalDesired.Package = EmptyNotePackage } } if canonicalDesired.Deployment != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Build, rawDesired.Image, rawDesired.Package, rawDesired.Discovery, rawDesired.Attestation) { canonicalDesired.Deployment = EmptyNoteDeployment } } if canonicalDesired.Discovery != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Build, rawDesired.Image, rawDesired.Package, rawDesired.Deployment, rawDesired.Attestation) { canonicalDesired.Discovery = EmptyNoteDiscovery } } if canonicalDesired.Attestation != nil { // Check if anything else is set. if dcl.AnySet(rawDesired.Vulnerability, rawDesired.Build, rawDesired.Image, rawDesired.Package, rawDesired.Deployment, rawDesired.Discovery) { canonicalDesired.Attestation = EmptyNoteAttestation } } return canonicalDesired, nil } func canonicalizeNoteNewState(c *Client, rawNew, rawDesired *Note) (*Note, error) { if dcl.IsEmptyValueIndirect(rawNew.Name) && dcl.IsEmptyValueIndirect(rawDesired.Name) { rawNew.Name = rawDesired.Name } else { if dcl.PartialSelfLinkToSelfLink(rawDesired.Name, rawNew.Name) { rawNew.Name = rawDesired.Name } } if dcl.IsEmptyValueIndirect(rawNew.ShortDescription) && dcl.IsEmptyValueIndirect(rawDesired.ShortDescription) { rawNew.ShortDescription = rawDesired.ShortDescription } else { if dcl.StringCanonicalize(rawDesired.ShortDescription, rawNew.ShortDescription) { rawNew.ShortDescription = rawDesired.ShortDescription } } if dcl.IsEmptyValueIndirect(rawNew.LongDescription) && dcl.IsEmptyValueIndirect(rawDesired.LongDescription) { rawNew.LongDescription = rawDesired.LongDescription } else { if dcl.StringCanonicalize(rawDesired.LongDescription, rawNew.LongDescription) { rawNew.LongDescription = rawDesired.LongDescription } } if dcl.IsEmptyValueIndirect(rawNew.RelatedUrl) && dcl.IsEmptyValueIndirect(rawDesired.RelatedUrl) { rawNew.RelatedUrl = rawDesired.RelatedUrl } else { rawNew.RelatedUrl = canonicalizeNewNoteRelatedUrlSlice(c, rawDesired.RelatedUrl, rawNew.RelatedUrl) } if dcl.IsEmptyValueIndirect(rawNew.ExpirationTime) && dcl.IsEmptyValueIndirect(rawDesired.ExpirationTime) { rawNew.ExpirationTime = rawDesired.ExpirationTime } else { } if dcl.IsEmptyValueIndirect(rawNew.CreateTime) && dcl.IsEmptyValueIndirect(rawDesired.CreateTime) { rawNew.CreateTime = rawDesired.CreateTime } else { } if dcl.IsEmptyValueIndirect(rawNew.UpdateTime) && dcl.IsEmptyValueIndirect(rawDesired.UpdateTime) { rawNew.UpdateTime = rawDesired.UpdateTime } else { } if dcl.IsEmptyValueIndirect(rawNew.RelatedNoteNames) && dcl.IsEmptyValueIndirect(rawDesired.RelatedNoteNames) { rawNew.RelatedNoteNames = rawDesired.RelatedNoteNames } else { if dcl.StringArrayCanonicalize(rawDesired.RelatedNoteNames, rawNew.RelatedNoteNames) { rawNew.RelatedNoteNames = rawDesired.RelatedNoteNames } } if dcl.IsEmptyValueIndirect(rawNew.Vulnerability) && dcl.IsEmptyValueIndirect(rawDesired.Vulnerability) { rawNew.Vulnerability = rawDesired.Vulnerability } else { rawNew.Vulnerability = canonicalizeNewNoteVulnerability(c, rawDesired.Vulnerability, rawNew.Vulnerability) } if dcl.IsEmptyValueIndirect(rawNew.Build) && dcl.IsEmptyValueIndirect(rawDesired.Build) { rawNew.Build = rawDesired.Build } else { rawNew.Build = canonicalizeNewNoteBuild(c, rawDesired.Build, rawNew.Build) } if dcl.IsEmptyValueIndirect(rawNew.Image) && dcl.IsEmptyValueIndirect(rawDesired.Image) { rawNew.Image = rawDesired.Image } else { rawNew.Image = canonicalizeNewNoteImage(c, rawDesired.Image, rawNew.Image) } if dcl.IsEmptyValueIndirect(rawNew.Package) && dcl.IsEmptyValueIndirect(rawDesired.Package) { rawNew.Package = rawDesired.Package } else { rawNew.Package = canonicalizeNewNotePackage(c, rawDesired.Package, rawNew.Package) } if dcl.IsEmptyValueIndirect(rawNew.Discovery) && dcl.IsEmptyValueIndirect(rawDesired.Discovery) { rawNew.Discovery = rawDesired.Discovery } else { rawNew.Discovery = canonicalizeNewNoteDiscovery(c, rawDesired.Discovery, rawNew.Discovery) } if dcl.IsEmptyValueIndirect(rawNew.Deployment) && dcl.IsEmptyValueIndirect(rawDesired.Deployment) { rawNew.Deployment = rawDesired.Deployment } else { rawNew.Deployment = canonicalizeNewNoteDeployment(c, rawDesired.Deployment, rawNew.Deployment) } if dcl.IsEmptyValueIndirect(rawNew.Attestation) && dcl.IsEmptyValueIndirect(rawDesired.Attestation) { rawNew.Attestation = rawDesired.Attestation } else { rawNew.Attestation = canonicalizeNewNoteAttestation(c, rawDesired.Attestation, rawNew.Attestation) } rawNew.Project = rawDesired.Project return rawNew, nil } func canonicalizeNoteRelatedUrl(des, initial *NoteRelatedUrl, opts ...dcl.ApplyOption) *NoteRelatedUrl { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteRelatedUrl{} if dcl.StringCanonicalize(des.Url, initial.Url) || dcl.IsZeroValue(des.Url) { cDes.Url = initial.Url } else { cDes.Url = des.Url } if dcl.StringCanonicalize(des.Label, initial.Label) || dcl.IsZeroValue(des.Label) { cDes.Label = initial.Label } else { cDes.Label = des.Label } return cDes } func canonicalizeNoteRelatedUrlSlice(des, initial []NoteRelatedUrl, opts ...dcl.ApplyOption) []NoteRelatedUrl { if des == nil { return initial } if len(des) != len(initial) { items := make([]NoteRelatedUrl, 0, len(des)) for _, d := range des { cd := canonicalizeNoteRelatedUrl(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteRelatedUrl, 0, len(des)) for i, d := range des { cd := canonicalizeNoteRelatedUrl(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteRelatedUrl(c *Client, des, nw *NoteRelatedUrl) *NoteRelatedUrl { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteRelatedUrl while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Url, nw.Url) { nw.Url = des.Url } if dcl.StringCanonicalize(des.Label, nw.Label) { nw.Label = des.Label } return nw } func canonicalizeNewNoteRelatedUrlSet(c *Client, des, nw []NoteRelatedUrl) []NoteRelatedUrl { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteRelatedUrl for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteRelatedUrlNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteRelatedUrl(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteRelatedUrlSlice(c *Client, des, nw []NoteRelatedUrl) []NoteRelatedUrl { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteRelatedUrl for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteRelatedUrl(c, &d, &n)) } return items } func canonicalizeNoteVulnerability(des, initial *NoteVulnerability, opts ...dcl.ApplyOption) *NoteVulnerability { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerability{} if dcl.IsZeroValue(des.CvssScore) || (dcl.IsEmptyValueIndirect(des.CvssScore) && dcl.IsEmptyValueIndirect(initial.CvssScore)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.CvssScore = initial.CvssScore } else { cDes.CvssScore = des.CvssScore } if dcl.IsZeroValue(des.Severity) || (dcl.IsEmptyValueIndirect(des.Severity) && dcl.IsEmptyValueIndirect(initial.Severity)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Severity = initial.Severity } else { cDes.Severity = des.Severity } cDes.Details = canonicalizeNoteVulnerabilityDetailsSlice(des.Details, initial.Details, opts...) cDes.CvssV3 = canonicalizeNoteVulnerabilityCvssV3(des.CvssV3, initial.CvssV3, opts...) cDes.WindowsDetails = canonicalizeNoteVulnerabilityWindowsDetailsSlice(des.WindowsDetails, initial.WindowsDetails, opts...) if dcl.IsZeroValue(des.SourceUpdateTime) || (dcl.IsEmptyValueIndirect(des.SourceUpdateTime) && dcl.IsEmptyValueIndirect(initial.SourceUpdateTime)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.SourceUpdateTime = initial.SourceUpdateTime } else { cDes.SourceUpdateTime = des.SourceUpdateTime } return cDes } func canonicalizeNoteVulnerabilitySlice(des, initial []NoteVulnerability, opts ...dcl.ApplyOption) []NoteVulnerability { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteVulnerability, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerability(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerability, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerability(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerability(c *Client, des, nw *NoteVulnerability) *NoteVulnerability { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerability while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } nw.Details = canonicalizeNewNoteVulnerabilityDetailsSlice(c, des.Details, nw.Details) nw.CvssV3 = canonicalizeNewNoteVulnerabilityCvssV3(c, des.CvssV3, nw.CvssV3) nw.WindowsDetails = canonicalizeNewNoteVulnerabilityWindowsDetailsSlice(c, des.WindowsDetails, nw.WindowsDetails) return nw } func canonicalizeNewNoteVulnerabilitySet(c *Client, des, nw []NoteVulnerability) []NoteVulnerability { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerability for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerability(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilitySlice(c *Client, des, nw []NoteVulnerability) []NoteVulnerability { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerability for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerability(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityDetails(des, initial *NoteVulnerabilityDetails, opts ...dcl.ApplyOption) *NoteVulnerabilityDetails { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityDetails{} if dcl.StringCanonicalize(des.SeverityName, initial.SeverityName) || dcl.IsZeroValue(des.SeverityName) { cDes.SeverityName = initial.SeverityName } else { cDes.SeverityName = des.SeverityName } if dcl.StringCanonicalize(des.Description, initial.Description) || dcl.IsZeroValue(des.Description) { cDes.Description = initial.Description } else { cDes.Description = des.Description } if dcl.StringCanonicalize(des.PackageType, initial.PackageType) || dcl.IsZeroValue(des.PackageType) { cDes.PackageType = initial.PackageType } else { cDes.PackageType = des.PackageType } if dcl.StringCanonicalize(des.AffectedCpeUri, initial.AffectedCpeUri) || dcl.IsZeroValue(des.AffectedCpeUri) { cDes.AffectedCpeUri = initial.AffectedCpeUri } else { cDes.AffectedCpeUri = des.AffectedCpeUri } if dcl.StringCanonicalize(des.AffectedPackage, initial.AffectedPackage) || dcl.IsZeroValue(des.AffectedPackage) { cDes.AffectedPackage = initial.AffectedPackage } else { cDes.AffectedPackage = des.AffectedPackage } cDes.AffectedVersionStart = canonicalizeNoteVulnerabilityDetailsAffectedVersionStart(des.AffectedVersionStart, initial.AffectedVersionStart, opts...) cDes.AffectedVersionEnd = canonicalizeNoteVulnerabilityDetailsAffectedVersionEnd(des.AffectedVersionEnd, initial.AffectedVersionEnd, opts...) if dcl.StringCanonicalize(des.FixedCpeUri, initial.FixedCpeUri) || dcl.IsZeroValue(des.FixedCpeUri) { cDes.FixedCpeUri = initial.FixedCpeUri } else { cDes.FixedCpeUri = des.FixedCpeUri } if dcl.StringCanonicalize(des.FixedPackage, initial.FixedPackage) || dcl.IsZeroValue(des.FixedPackage) { cDes.FixedPackage = initial.FixedPackage } else { cDes.FixedPackage = des.FixedPackage } cDes.FixedVersion = canonicalizeNoteVulnerabilityDetailsFixedVersion(des.FixedVersion, initial.FixedVersion, opts...) if dcl.BoolCanonicalize(des.IsObsolete, initial.IsObsolete) || dcl.IsZeroValue(des.IsObsolete) { cDes.IsObsolete = initial.IsObsolete } else { cDes.IsObsolete = des.IsObsolete } if dcl.IsZeroValue(des.SourceUpdateTime) || (dcl.IsEmptyValueIndirect(des.SourceUpdateTime) && dcl.IsEmptyValueIndirect(initial.SourceUpdateTime)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.SourceUpdateTime = initial.SourceUpdateTime } else { cDes.SourceUpdateTime = des.SourceUpdateTime } return cDes } func canonicalizeNoteVulnerabilityDetailsSlice(des, initial []NoteVulnerabilityDetails, opts ...dcl.ApplyOption) []NoteVulnerabilityDetails { if des == nil { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityDetails, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityDetails(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityDetails, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityDetails(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityDetails(c *Client, des, nw *NoteVulnerabilityDetails) *NoteVulnerabilityDetails { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityDetails while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.SeverityName, nw.SeverityName) { nw.SeverityName = des.SeverityName } if dcl.StringCanonicalize(des.Description, nw.Description) { nw.Description = des.Description } if dcl.StringCanonicalize(des.PackageType, nw.PackageType) { nw.PackageType = des.PackageType } if dcl.StringCanonicalize(des.AffectedCpeUri, nw.AffectedCpeUri) { nw.AffectedCpeUri = des.AffectedCpeUri } if dcl.StringCanonicalize(des.AffectedPackage, nw.AffectedPackage) { nw.AffectedPackage = des.AffectedPackage } nw.AffectedVersionStart = canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStart(c, des.AffectedVersionStart, nw.AffectedVersionStart) nw.AffectedVersionEnd = canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEnd(c, des.AffectedVersionEnd, nw.AffectedVersionEnd) if dcl.StringCanonicalize(des.FixedCpeUri, nw.FixedCpeUri) { nw.FixedCpeUri = des.FixedCpeUri } if dcl.StringCanonicalize(des.FixedPackage, nw.FixedPackage) { nw.FixedPackage = des.FixedPackage } nw.FixedVersion = canonicalizeNewNoteVulnerabilityDetailsFixedVersion(c, des.FixedVersion, nw.FixedVersion) if dcl.BoolCanonicalize(des.IsObsolete, nw.IsObsolete) { nw.IsObsolete = des.IsObsolete } return nw } func canonicalizeNewNoteVulnerabilityDetailsSet(c *Client, des, nw []NoteVulnerabilityDetails) []NoteVulnerabilityDetails { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityDetails for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityDetailsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityDetails(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityDetailsSlice(c *Client, des, nw []NoteVulnerabilityDetails) []NoteVulnerabilityDetails { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityDetails for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityDetails(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityDetailsAffectedVersionStart(des, initial *NoteVulnerabilityDetailsAffectedVersionStart, opts ...dcl.ApplyOption) *NoteVulnerabilityDetailsAffectedVersionStart { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityDetailsAffectedVersionStart{} if dcl.IsZeroValue(des.Epoch) || (dcl.IsEmptyValueIndirect(des.Epoch) && dcl.IsEmptyValueIndirect(initial.Epoch)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Epoch = initial.Epoch } else { cDes.Epoch = des.Epoch } if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Kind) || (dcl.IsEmptyValueIndirect(des.Kind) && dcl.IsEmptyValueIndirect(initial.Kind)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Kind = initial.Kind } else { cDes.Kind = des.Kind } if dcl.StringCanonicalize(des.FullName, initial.FullName) || dcl.IsZeroValue(des.FullName) { cDes.FullName = initial.FullName } else { cDes.FullName = des.FullName } return cDes } func canonicalizeNoteVulnerabilityDetailsAffectedVersionStartSlice(des, initial []NoteVulnerabilityDetailsAffectedVersionStart, opts ...dcl.ApplyOption) []NoteVulnerabilityDetailsAffectedVersionStart { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityDetailsAffectedVersionStart, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityDetailsAffectedVersionStart(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityDetailsAffectedVersionStart, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityDetailsAffectedVersionStart(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStart(c *Client, des, nw *NoteVulnerabilityDetailsAffectedVersionStart) *NoteVulnerabilityDetailsAffectedVersionStart { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityDetailsAffectedVersionStart while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.FullName, nw.FullName) { nw.FullName = des.FullName } return nw } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStartSet(c *Client, des, nw []NoteVulnerabilityDetailsAffectedVersionStart) []NoteVulnerabilityDetailsAffectedVersionStart { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityDetailsAffectedVersionStart for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityDetailsAffectedVersionStartNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStart(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStartSlice(c *Client, des, nw []NoteVulnerabilityDetailsAffectedVersionStart) []NoteVulnerabilityDetailsAffectedVersionStart { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityDetailsAffectedVersionStart for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityDetailsAffectedVersionStart(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityDetailsAffectedVersionEnd(des, initial *NoteVulnerabilityDetailsAffectedVersionEnd, opts ...dcl.ApplyOption) *NoteVulnerabilityDetailsAffectedVersionEnd { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityDetailsAffectedVersionEnd{} if dcl.IsZeroValue(des.Epoch) || (dcl.IsEmptyValueIndirect(des.Epoch) && dcl.IsEmptyValueIndirect(initial.Epoch)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Epoch = initial.Epoch } else { cDes.Epoch = des.Epoch } if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Kind) || (dcl.IsEmptyValueIndirect(des.Kind) && dcl.IsEmptyValueIndirect(initial.Kind)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Kind = initial.Kind } else { cDes.Kind = des.Kind } if dcl.StringCanonicalize(des.FullName, initial.FullName) || dcl.IsZeroValue(des.FullName) { cDes.FullName = initial.FullName } else { cDes.FullName = des.FullName } return cDes } func canonicalizeNoteVulnerabilityDetailsAffectedVersionEndSlice(des, initial []NoteVulnerabilityDetailsAffectedVersionEnd, opts ...dcl.ApplyOption) []NoteVulnerabilityDetailsAffectedVersionEnd { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityDetailsAffectedVersionEnd, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityDetailsAffectedVersionEnd(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityDetailsAffectedVersionEnd, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityDetailsAffectedVersionEnd(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEnd(c *Client, des, nw *NoteVulnerabilityDetailsAffectedVersionEnd) *NoteVulnerabilityDetailsAffectedVersionEnd { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityDetailsAffectedVersionEnd while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.FullName, nw.FullName) { nw.FullName = des.FullName } return nw } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEndSet(c *Client, des, nw []NoteVulnerabilityDetailsAffectedVersionEnd) []NoteVulnerabilityDetailsAffectedVersionEnd { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityDetailsAffectedVersionEnd for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityDetailsAffectedVersionEndNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEnd(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEndSlice(c *Client, des, nw []NoteVulnerabilityDetailsAffectedVersionEnd) []NoteVulnerabilityDetailsAffectedVersionEnd { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityDetailsAffectedVersionEnd for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityDetailsAffectedVersionEnd(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityDetailsFixedVersion(des, initial *NoteVulnerabilityDetailsFixedVersion, opts ...dcl.ApplyOption) *NoteVulnerabilityDetailsFixedVersion { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityDetailsFixedVersion{} if dcl.IsZeroValue(des.Epoch) || (dcl.IsEmptyValueIndirect(des.Epoch) && dcl.IsEmptyValueIndirect(initial.Epoch)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Epoch = initial.Epoch } else { cDes.Epoch = des.Epoch } if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Kind) || (dcl.IsEmptyValueIndirect(des.Kind) && dcl.IsEmptyValueIndirect(initial.Kind)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Kind = initial.Kind } else { cDes.Kind = des.Kind } if dcl.StringCanonicalize(des.FullName, initial.FullName) || dcl.IsZeroValue(des.FullName) { cDes.FullName = initial.FullName } else { cDes.FullName = des.FullName } return cDes } func canonicalizeNoteVulnerabilityDetailsFixedVersionSlice(des, initial []NoteVulnerabilityDetailsFixedVersion, opts ...dcl.ApplyOption) []NoteVulnerabilityDetailsFixedVersion { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityDetailsFixedVersion, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityDetailsFixedVersion(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityDetailsFixedVersion, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityDetailsFixedVersion(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityDetailsFixedVersion(c *Client, des, nw *NoteVulnerabilityDetailsFixedVersion) *NoteVulnerabilityDetailsFixedVersion { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityDetailsFixedVersion while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.FullName, nw.FullName) { nw.FullName = des.FullName } return nw } func canonicalizeNewNoteVulnerabilityDetailsFixedVersionSet(c *Client, des, nw []NoteVulnerabilityDetailsFixedVersion) []NoteVulnerabilityDetailsFixedVersion { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityDetailsFixedVersion for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityDetailsFixedVersionNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityDetailsFixedVersion(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityDetailsFixedVersionSlice(c *Client, des, nw []NoteVulnerabilityDetailsFixedVersion) []NoteVulnerabilityDetailsFixedVersion { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityDetailsFixedVersion for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityDetailsFixedVersion(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityCvssV3(des, initial *NoteVulnerabilityCvssV3, opts ...dcl.ApplyOption) *NoteVulnerabilityCvssV3 { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityCvssV3{} if dcl.IsZeroValue(des.BaseScore) || (dcl.IsEmptyValueIndirect(des.BaseScore) && dcl.IsEmptyValueIndirect(initial.BaseScore)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.BaseScore = initial.BaseScore } else { cDes.BaseScore = des.BaseScore } if dcl.IsZeroValue(des.ExploitabilityScore) || (dcl.IsEmptyValueIndirect(des.ExploitabilityScore) && dcl.IsEmptyValueIndirect(initial.ExploitabilityScore)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ExploitabilityScore = initial.ExploitabilityScore } else { cDes.ExploitabilityScore = des.ExploitabilityScore } if dcl.IsZeroValue(des.ImpactScore) || (dcl.IsEmptyValueIndirect(des.ImpactScore) && dcl.IsEmptyValueIndirect(initial.ImpactScore)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ImpactScore = initial.ImpactScore } else { cDes.ImpactScore = des.ImpactScore } if dcl.IsZeroValue(des.AttackVector) || (dcl.IsEmptyValueIndirect(des.AttackVector) && dcl.IsEmptyValueIndirect(initial.AttackVector)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.AttackVector = initial.AttackVector } else { cDes.AttackVector = des.AttackVector } if dcl.IsZeroValue(des.AttackComplexity) || (dcl.IsEmptyValueIndirect(des.AttackComplexity) && dcl.IsEmptyValueIndirect(initial.AttackComplexity)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.AttackComplexity = initial.AttackComplexity } else { cDes.AttackComplexity = des.AttackComplexity } if dcl.IsZeroValue(des.PrivilegesRequired) || (dcl.IsEmptyValueIndirect(des.PrivilegesRequired) && dcl.IsEmptyValueIndirect(initial.PrivilegesRequired)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.PrivilegesRequired = initial.PrivilegesRequired } else { cDes.PrivilegesRequired = des.PrivilegesRequired } if dcl.IsZeroValue(des.UserInteraction) || (dcl.IsEmptyValueIndirect(des.UserInteraction) && dcl.IsEmptyValueIndirect(initial.UserInteraction)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.UserInteraction = initial.UserInteraction } else { cDes.UserInteraction = des.UserInteraction } if dcl.IsZeroValue(des.Scope) || (dcl.IsEmptyValueIndirect(des.Scope) && dcl.IsEmptyValueIndirect(initial.Scope)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Scope = initial.Scope } else { cDes.Scope = des.Scope } if dcl.IsZeroValue(des.ConfidentialityImpact) || (dcl.IsEmptyValueIndirect(des.ConfidentialityImpact) && dcl.IsEmptyValueIndirect(initial.ConfidentialityImpact)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.ConfidentialityImpact = initial.ConfidentialityImpact } else { cDes.ConfidentialityImpact = des.ConfidentialityImpact } if dcl.IsZeroValue(des.IntegrityImpact) || (dcl.IsEmptyValueIndirect(des.IntegrityImpact) && dcl.IsEmptyValueIndirect(initial.IntegrityImpact)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.IntegrityImpact = initial.IntegrityImpact } else { cDes.IntegrityImpact = des.IntegrityImpact } if dcl.IsZeroValue(des.AvailabilityImpact) || (dcl.IsEmptyValueIndirect(des.AvailabilityImpact) && dcl.IsEmptyValueIndirect(initial.AvailabilityImpact)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.AvailabilityImpact = initial.AvailabilityImpact } else { cDes.AvailabilityImpact = des.AvailabilityImpact } return cDes } func canonicalizeNoteVulnerabilityCvssV3Slice(des, initial []NoteVulnerabilityCvssV3, opts ...dcl.ApplyOption) []NoteVulnerabilityCvssV3 { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityCvssV3, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityCvssV3(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityCvssV3, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityCvssV3(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityCvssV3(c *Client, des, nw *NoteVulnerabilityCvssV3) *NoteVulnerabilityCvssV3 { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityCvssV3 while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } return nw } func canonicalizeNewNoteVulnerabilityCvssV3Set(c *Client, des, nw []NoteVulnerabilityCvssV3) []NoteVulnerabilityCvssV3 { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityCvssV3 for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityCvssV3NewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityCvssV3(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityCvssV3Slice(c *Client, des, nw []NoteVulnerabilityCvssV3) []NoteVulnerabilityCvssV3 { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityCvssV3 for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityCvssV3(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityWindowsDetails(des, initial *NoteVulnerabilityWindowsDetails, opts ...dcl.ApplyOption) *NoteVulnerabilityWindowsDetails { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityWindowsDetails{} if dcl.StringCanonicalize(des.CpeUri, initial.CpeUri) || dcl.IsZeroValue(des.CpeUri) { cDes.CpeUri = initial.CpeUri } else { cDes.CpeUri = des.CpeUri } if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Description, initial.Description) || dcl.IsZeroValue(des.Description) { cDes.Description = initial.Description } else { cDes.Description = des.Description } cDes.FixingKbs = canonicalizeNoteVulnerabilityWindowsDetailsFixingKbsSlice(des.FixingKbs, initial.FixingKbs, opts...) return cDes } func canonicalizeNoteVulnerabilityWindowsDetailsSlice(des, initial []NoteVulnerabilityWindowsDetails, opts ...dcl.ApplyOption) []NoteVulnerabilityWindowsDetails { if des == nil { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityWindowsDetails, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityWindowsDetails(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityWindowsDetails, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityWindowsDetails(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityWindowsDetails(c *Client, des, nw *NoteVulnerabilityWindowsDetails) *NoteVulnerabilityWindowsDetails { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityWindowsDetails while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.CpeUri, nw.CpeUri) { nw.CpeUri = des.CpeUri } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Description, nw.Description) { nw.Description = des.Description } nw.FixingKbs = canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbsSlice(c, des.FixingKbs, nw.FixingKbs) return nw } func canonicalizeNewNoteVulnerabilityWindowsDetailsSet(c *Client, des, nw []NoteVulnerabilityWindowsDetails) []NoteVulnerabilityWindowsDetails { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityWindowsDetails for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityWindowsDetailsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityWindowsDetails(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityWindowsDetailsSlice(c *Client, des, nw []NoteVulnerabilityWindowsDetails) []NoteVulnerabilityWindowsDetails { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityWindowsDetails for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityWindowsDetails(c, &d, &n)) } return items } func canonicalizeNoteVulnerabilityWindowsDetailsFixingKbs(des, initial *NoteVulnerabilityWindowsDetailsFixingKbs, opts ...dcl.ApplyOption) *NoteVulnerabilityWindowsDetailsFixingKbs { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteVulnerabilityWindowsDetailsFixingKbs{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Url, initial.Url) || dcl.IsZeroValue(des.Url) { cDes.Url = initial.Url } else { cDes.Url = des.Url } return cDes } func canonicalizeNoteVulnerabilityWindowsDetailsFixingKbsSlice(des, initial []NoteVulnerabilityWindowsDetailsFixingKbs, opts ...dcl.ApplyOption) []NoteVulnerabilityWindowsDetailsFixingKbs { if des == nil { return initial } if len(des) != len(initial) { items := make([]NoteVulnerabilityWindowsDetailsFixingKbs, 0, len(des)) for _, d := range des { cd := canonicalizeNoteVulnerabilityWindowsDetailsFixingKbs(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteVulnerabilityWindowsDetailsFixingKbs, 0, len(des)) for i, d := range des { cd := canonicalizeNoteVulnerabilityWindowsDetailsFixingKbs(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbs(c *Client, des, nw *NoteVulnerabilityWindowsDetailsFixingKbs) *NoteVulnerabilityWindowsDetailsFixingKbs { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteVulnerabilityWindowsDetailsFixingKbs while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Url, nw.Url) { nw.Url = des.Url } return nw } func canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbsSet(c *Client, des, nw []NoteVulnerabilityWindowsDetailsFixingKbs) []NoteVulnerabilityWindowsDetailsFixingKbs { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteVulnerabilityWindowsDetailsFixingKbs for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteVulnerabilityWindowsDetailsFixingKbsNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbs(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbsSlice(c *Client, des, nw []NoteVulnerabilityWindowsDetailsFixingKbs) []NoteVulnerabilityWindowsDetailsFixingKbs { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteVulnerabilityWindowsDetailsFixingKbs for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteVulnerabilityWindowsDetailsFixingKbs(c, &d, &n)) } return items } func canonicalizeNoteBuild(des, initial *NoteBuild, opts ...dcl.ApplyOption) *NoteBuild { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteBuild{} if dcl.StringCanonicalize(des.BuilderVersion, initial.BuilderVersion) || dcl.IsZeroValue(des.BuilderVersion) { cDes.BuilderVersion = initial.BuilderVersion } else { cDes.BuilderVersion = des.BuilderVersion } cDes.Signature = canonicalizeNoteBuildSignature(des.Signature, initial.Signature, opts...) return cDes } func canonicalizeNoteBuildSlice(des, initial []NoteBuild, opts ...dcl.ApplyOption) []NoteBuild { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteBuild, 0, len(des)) for _, d := range des { cd := canonicalizeNoteBuild(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteBuild, 0, len(des)) for i, d := range des { cd := canonicalizeNoteBuild(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteBuild(c *Client, des, nw *NoteBuild) *NoteBuild { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteBuild while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.BuilderVersion, nw.BuilderVersion) { nw.BuilderVersion = des.BuilderVersion } nw.Signature = canonicalizeNewNoteBuildSignature(c, des.Signature, nw.Signature) return nw } func canonicalizeNewNoteBuildSet(c *Client, des, nw []NoteBuild) []NoteBuild { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteBuild for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteBuildNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteBuild(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteBuildSlice(c *Client, des, nw []NoteBuild) []NoteBuild { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteBuild for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteBuild(c, &d, &n)) } return items } func canonicalizeNoteBuildSignature(des, initial *NoteBuildSignature, opts ...dcl.ApplyOption) *NoteBuildSignature { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteBuildSignature{} if dcl.StringCanonicalize(des.PublicKey, initial.PublicKey) || dcl.IsZeroValue(des.PublicKey) { cDes.PublicKey = initial.PublicKey } else { cDes.PublicKey = des.PublicKey } if dcl.StringCanonicalize(des.Signature, initial.Signature) || dcl.IsZeroValue(des.Signature) { cDes.Signature = initial.Signature } else { cDes.Signature = des.Signature } if dcl.StringCanonicalize(des.KeyId, initial.KeyId) || dcl.IsZeroValue(des.KeyId) { cDes.KeyId = initial.KeyId } else { cDes.KeyId = des.KeyId } if dcl.IsZeroValue(des.KeyType) || (dcl.IsEmptyValueIndirect(des.KeyType) && dcl.IsEmptyValueIndirect(initial.KeyType)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.KeyType = initial.KeyType } else { cDes.KeyType = des.KeyType } return cDes } func canonicalizeNoteBuildSignatureSlice(des, initial []NoteBuildSignature, opts ...dcl.ApplyOption) []NoteBuildSignature { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteBuildSignature, 0, len(des)) for _, d := range des { cd := canonicalizeNoteBuildSignature(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteBuildSignature, 0, len(des)) for i, d := range des { cd := canonicalizeNoteBuildSignature(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteBuildSignature(c *Client, des, nw *NoteBuildSignature) *NoteBuildSignature { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteBuildSignature while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.PublicKey, nw.PublicKey) { nw.PublicKey = des.PublicKey } if dcl.StringCanonicalize(des.Signature, nw.Signature) { nw.Signature = des.Signature } if dcl.StringCanonicalize(des.KeyId, nw.KeyId) { nw.KeyId = des.KeyId } return nw } func canonicalizeNewNoteBuildSignatureSet(c *Client, des, nw []NoteBuildSignature) []NoteBuildSignature { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteBuildSignature for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteBuildSignatureNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteBuildSignature(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteBuildSignatureSlice(c *Client, des, nw []NoteBuildSignature) []NoteBuildSignature { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteBuildSignature for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteBuildSignature(c, &d, &n)) } return items } func canonicalizeNoteImage(des, initial *NoteImage, opts ...dcl.ApplyOption) *NoteImage { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteImage{} if dcl.StringCanonicalize(des.ResourceUrl, initial.ResourceUrl) || dcl.IsZeroValue(des.ResourceUrl) { cDes.ResourceUrl = initial.ResourceUrl } else { cDes.ResourceUrl = des.ResourceUrl } cDes.Fingerprint = canonicalizeNoteImageFingerprint(des.Fingerprint, initial.Fingerprint, opts...) return cDes } func canonicalizeNoteImageSlice(des, initial []NoteImage, opts ...dcl.ApplyOption) []NoteImage { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteImage, 0, len(des)) for _, d := range des { cd := canonicalizeNoteImage(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteImage, 0, len(des)) for i, d := range des { cd := canonicalizeNoteImage(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteImage(c *Client, des, nw *NoteImage) *NoteImage { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteImage while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.ResourceUrl, nw.ResourceUrl) { nw.ResourceUrl = des.ResourceUrl } nw.Fingerprint = canonicalizeNewNoteImageFingerprint(c, des.Fingerprint, nw.Fingerprint) return nw } func canonicalizeNewNoteImageSet(c *Client, des, nw []NoteImage) []NoteImage { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteImage for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteImageNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteImage(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteImageSlice(c *Client, des, nw []NoteImage) []NoteImage { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteImage for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteImage(c, &d, &n)) } return items } func canonicalizeNoteImageFingerprint(des, initial *NoteImageFingerprint, opts ...dcl.ApplyOption) *NoteImageFingerprint { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteImageFingerprint{} if dcl.StringCanonicalize(des.V1Name, initial.V1Name) || dcl.IsZeroValue(des.V1Name) { cDes.V1Name = initial.V1Name } else { cDes.V1Name = des.V1Name } if dcl.StringArrayCanonicalize(des.V2Blob, initial.V2Blob) { cDes.V2Blob = initial.V2Blob } else { cDes.V2Blob = des.V2Blob } return cDes } func canonicalizeNoteImageFingerprintSlice(des, initial []NoteImageFingerprint, opts ...dcl.ApplyOption) []NoteImageFingerprint { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteImageFingerprint, 0, len(des)) for _, d := range des { cd := canonicalizeNoteImageFingerprint(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteImageFingerprint, 0, len(des)) for i, d := range des { cd := canonicalizeNoteImageFingerprint(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteImageFingerprint(c *Client, des, nw *NoteImageFingerprint) *NoteImageFingerprint { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteImageFingerprint while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.V1Name, nw.V1Name) { nw.V1Name = des.V1Name } if dcl.StringArrayCanonicalize(des.V2Blob, nw.V2Blob) { nw.V2Blob = des.V2Blob } if dcl.StringCanonicalize(des.V2Name, nw.V2Name) { nw.V2Name = des.V2Name } return nw } func canonicalizeNewNoteImageFingerprintSet(c *Client, des, nw []NoteImageFingerprint) []NoteImageFingerprint { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteImageFingerprint for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteImageFingerprintNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteImageFingerprint(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteImageFingerprintSlice(c *Client, des, nw []NoteImageFingerprint) []NoteImageFingerprint { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteImageFingerprint for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteImageFingerprint(c, &d, &n)) } return items } func canonicalizeNotePackage(des, initial *NotePackage, opts ...dcl.ApplyOption) *NotePackage { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NotePackage{} if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } cDes.Distribution = canonicalizeNotePackageDistributionSlice(des.Distribution, initial.Distribution, opts...) return cDes } func canonicalizeNotePackageSlice(des, initial []NotePackage, opts ...dcl.ApplyOption) []NotePackage { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NotePackage, 0, len(des)) for _, d := range des { cd := canonicalizeNotePackage(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NotePackage, 0, len(des)) for i, d := range des { cd := canonicalizeNotePackage(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNotePackage(c *Client, des, nw *NotePackage) *NotePackage { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NotePackage while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } nw.Distribution = canonicalizeNewNotePackageDistributionSlice(c, des.Distribution, nw.Distribution) return nw } func canonicalizeNewNotePackageSet(c *Client, des, nw []NotePackage) []NotePackage { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NotePackage for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNotePackageNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNotePackage(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNotePackageSlice(c *Client, des, nw []NotePackage) []NotePackage { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NotePackage for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNotePackage(c, &d, &n)) } return items } func canonicalizeNotePackageDistribution(des, initial *NotePackageDistribution, opts ...dcl.ApplyOption) *NotePackageDistribution { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NotePackageDistribution{} if dcl.StringCanonicalize(des.CpeUri, initial.CpeUri) || dcl.IsZeroValue(des.CpeUri) { cDes.CpeUri = initial.CpeUri } else { cDes.CpeUri = des.CpeUri } if dcl.IsZeroValue(des.Architecture) || (dcl.IsEmptyValueIndirect(des.Architecture) && dcl.IsEmptyValueIndirect(initial.Architecture)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Architecture = initial.Architecture } else { cDes.Architecture = des.Architecture } cDes.LatestVersion = canonicalizeNotePackageDistributionLatestVersion(des.LatestVersion, initial.LatestVersion, opts...) if dcl.StringCanonicalize(des.Maintainer, initial.Maintainer) || dcl.IsZeroValue(des.Maintainer) { cDes.Maintainer = initial.Maintainer } else { cDes.Maintainer = des.Maintainer } if dcl.StringCanonicalize(des.Url, initial.Url) || dcl.IsZeroValue(des.Url) { cDes.Url = initial.Url } else { cDes.Url = des.Url } if dcl.StringCanonicalize(des.Description, initial.Description) || dcl.IsZeroValue(des.Description) { cDes.Description = initial.Description } else { cDes.Description = des.Description } return cDes } func canonicalizeNotePackageDistributionSlice(des, initial []NotePackageDistribution, opts ...dcl.ApplyOption) []NotePackageDistribution { if des == nil { return initial } if len(des) != len(initial) { items := make([]NotePackageDistribution, 0, len(des)) for _, d := range des { cd := canonicalizeNotePackageDistribution(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NotePackageDistribution, 0, len(des)) for i, d := range des { cd := canonicalizeNotePackageDistribution(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNotePackageDistribution(c *Client, des, nw *NotePackageDistribution) *NotePackageDistribution { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NotePackageDistribution while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.CpeUri, nw.CpeUri) { nw.CpeUri = des.CpeUri } nw.LatestVersion = canonicalizeNewNotePackageDistributionLatestVersion(c, des.LatestVersion, nw.LatestVersion) if dcl.StringCanonicalize(des.Maintainer, nw.Maintainer) { nw.Maintainer = des.Maintainer } if dcl.StringCanonicalize(des.Url, nw.Url) { nw.Url = des.Url } if dcl.StringCanonicalize(des.Description, nw.Description) { nw.Description = des.Description } return nw } func canonicalizeNewNotePackageDistributionSet(c *Client, des, nw []NotePackageDistribution) []NotePackageDistribution { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NotePackageDistribution for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNotePackageDistributionNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNotePackageDistribution(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNotePackageDistributionSlice(c *Client, des, nw []NotePackageDistribution) []NotePackageDistribution { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NotePackageDistribution for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNotePackageDistribution(c, &d, &n)) } return items } func canonicalizeNotePackageDistributionLatestVersion(des, initial *NotePackageDistributionLatestVersion, opts ...dcl.ApplyOption) *NotePackageDistributionLatestVersion { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NotePackageDistributionLatestVersion{} if dcl.IsZeroValue(des.Epoch) || (dcl.IsEmptyValueIndirect(des.Epoch) && dcl.IsEmptyValueIndirect(initial.Epoch)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Epoch = initial.Epoch } else { cDes.Epoch = des.Epoch } if dcl.StringCanonicalize(des.Name, initial.Name) || dcl.IsZeroValue(des.Name) { cDes.Name = initial.Name } else { cDes.Name = des.Name } if dcl.StringCanonicalize(des.Revision, initial.Revision) || dcl.IsZeroValue(des.Revision) { cDes.Revision = initial.Revision } else { cDes.Revision = des.Revision } if dcl.IsZeroValue(des.Kind) || (dcl.IsEmptyValueIndirect(des.Kind) && dcl.IsEmptyValueIndirect(initial.Kind)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.Kind = initial.Kind } else { cDes.Kind = des.Kind } if dcl.StringCanonicalize(des.FullName, initial.FullName) || dcl.IsZeroValue(des.FullName) { cDes.FullName = initial.FullName } else { cDes.FullName = des.FullName } return cDes } func canonicalizeNotePackageDistributionLatestVersionSlice(des, initial []NotePackageDistributionLatestVersion, opts ...dcl.ApplyOption) []NotePackageDistributionLatestVersion { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NotePackageDistributionLatestVersion, 0, len(des)) for _, d := range des { cd := canonicalizeNotePackageDistributionLatestVersion(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NotePackageDistributionLatestVersion, 0, len(des)) for i, d := range des { cd := canonicalizeNotePackageDistributionLatestVersion(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNotePackageDistributionLatestVersion(c *Client, des, nw *NotePackageDistributionLatestVersion) *NotePackageDistributionLatestVersion { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NotePackageDistributionLatestVersion while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.Name, nw.Name) { nw.Name = des.Name } if dcl.StringCanonicalize(des.Revision, nw.Revision) { nw.Revision = des.Revision } if dcl.StringCanonicalize(des.FullName, nw.FullName) { nw.FullName = des.FullName } return nw } func canonicalizeNewNotePackageDistributionLatestVersionSet(c *Client, des, nw []NotePackageDistributionLatestVersion) []NotePackageDistributionLatestVersion { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NotePackageDistributionLatestVersion for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNotePackageDistributionLatestVersionNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNotePackageDistributionLatestVersion(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNotePackageDistributionLatestVersionSlice(c *Client, des, nw []NotePackageDistributionLatestVersion) []NotePackageDistributionLatestVersion { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NotePackageDistributionLatestVersion for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNotePackageDistributionLatestVersion(c, &d, &n)) } return items } func canonicalizeNoteDiscovery(des, initial *NoteDiscovery, opts ...dcl.ApplyOption) *NoteDiscovery { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteDiscovery{} if dcl.IsZeroValue(des.AnalysisKind) || (dcl.IsEmptyValueIndirect(des.AnalysisKind) && dcl.IsEmptyValueIndirect(initial.AnalysisKind)) { // Desired and initial values are equivalent, so set canonical desired value to initial value. cDes.AnalysisKind = initial.AnalysisKind } else { cDes.AnalysisKind = des.AnalysisKind } return cDes } func canonicalizeNoteDiscoverySlice(des, initial []NoteDiscovery, opts ...dcl.ApplyOption) []NoteDiscovery { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteDiscovery, 0, len(des)) for _, d := range des { cd := canonicalizeNoteDiscovery(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteDiscovery, 0, len(des)) for i, d := range des { cd := canonicalizeNoteDiscovery(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteDiscovery(c *Client, des, nw *NoteDiscovery) *NoteDiscovery { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteDiscovery while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } return nw } func canonicalizeNewNoteDiscoverySet(c *Client, des, nw []NoteDiscovery) []NoteDiscovery { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteDiscovery for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteDiscoveryNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteDiscovery(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteDiscoverySlice(c *Client, des, nw []NoteDiscovery) []NoteDiscovery { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteDiscovery for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteDiscovery(c, &d, &n)) } return items } func canonicalizeNoteDeployment(des, initial *NoteDeployment, opts ...dcl.ApplyOption) *NoteDeployment { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteDeployment{} if dcl.StringArrayCanonicalize(des.ResourceUri, initial.ResourceUri) { cDes.ResourceUri = initial.ResourceUri } else { cDes.ResourceUri = des.ResourceUri } return cDes } func canonicalizeNoteDeploymentSlice(des, initial []NoteDeployment, opts ...dcl.ApplyOption) []NoteDeployment { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteDeployment, 0, len(des)) for _, d := range des { cd := canonicalizeNoteDeployment(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteDeployment, 0, len(des)) for i, d := range des { cd := canonicalizeNoteDeployment(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteDeployment(c *Client, des, nw *NoteDeployment) *NoteDeployment { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteDeployment while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringArrayCanonicalize(des.ResourceUri, nw.ResourceUri) { nw.ResourceUri = des.ResourceUri } return nw } func canonicalizeNewNoteDeploymentSet(c *Client, des, nw []NoteDeployment) []NoteDeployment { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteDeployment for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteDeploymentNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteDeployment(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteDeploymentSlice(c *Client, des, nw []NoteDeployment) []NoteDeployment { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteDeployment for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteDeployment(c, &d, &n)) } return items } func canonicalizeNoteAttestation(des, initial *NoteAttestation, opts ...dcl.ApplyOption) *NoteAttestation { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteAttestation{} cDes.Hint = canonicalizeNoteAttestationHint(des.Hint, initial.Hint, opts...) return cDes } func canonicalizeNoteAttestationSlice(des, initial []NoteAttestation, opts ...dcl.ApplyOption) []NoteAttestation { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteAttestation, 0, len(des)) for _, d := range des { cd := canonicalizeNoteAttestation(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteAttestation, 0, len(des)) for i, d := range des { cd := canonicalizeNoteAttestation(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteAttestation(c *Client, des, nw *NoteAttestation) *NoteAttestation { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteAttestation while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } nw.Hint = canonicalizeNewNoteAttestationHint(c, des.Hint, nw.Hint) return nw } func canonicalizeNewNoteAttestationSet(c *Client, des, nw []NoteAttestation) []NoteAttestation { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteAttestation for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteAttestationNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteAttestation(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteAttestationSlice(c *Client, des, nw []NoteAttestation) []NoteAttestation { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteAttestation for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteAttestation(c, &d, &n)) } return items } func canonicalizeNoteAttestationHint(des, initial *NoteAttestationHint, opts ...dcl.ApplyOption) *NoteAttestationHint { if des == nil { return initial } if des.empty { return des } if initial == nil { return des } cDes := &NoteAttestationHint{} if dcl.StringCanonicalize(des.HumanReadableName, initial.HumanReadableName) || dcl.IsZeroValue(des.HumanReadableName) { cDes.HumanReadableName = initial.HumanReadableName } else { cDes.HumanReadableName = des.HumanReadableName } return cDes } func canonicalizeNoteAttestationHintSlice(des, initial []NoteAttestationHint, opts ...dcl.ApplyOption) []NoteAttestationHint { if dcl.IsEmptyValueIndirect(des) { return initial } if len(des) != len(initial) { items := make([]NoteAttestationHint, 0, len(des)) for _, d := range des { cd := canonicalizeNoteAttestationHint(&d, nil, opts...) if cd != nil { items = append(items, *cd) } } return items } items := make([]NoteAttestationHint, 0, len(des)) for i, d := range des { cd := canonicalizeNoteAttestationHint(&d, &initial[i], opts...) if cd != nil { items = append(items, *cd) } } return items } func canonicalizeNewNoteAttestationHint(c *Client, des, nw *NoteAttestationHint) *NoteAttestationHint { if des == nil { return nw } if nw == nil { if dcl.IsEmptyValueIndirect(des) { c.Config.Logger.Info("Found explicitly empty value for NoteAttestationHint while comparing non-nil desired to nil actual. Returning desired object.") return des } return nil } if dcl.StringCanonicalize(des.HumanReadableName, nw.HumanReadableName) { nw.HumanReadableName = des.HumanReadableName } return nw } func canonicalizeNewNoteAttestationHintSet(c *Client, des, nw []NoteAttestationHint) []NoteAttestationHint { if des == nil { return nw } // Find the elements in des that are also in nw and canonicalize them. Remove matched elements from nw. var items []NoteAttestationHint for _, d := range des { matchedIndex := -1 for i, n := range nw { if diffs, _ := compareNoteAttestationHintNewStyle(&d, &n, dcl.FieldName{}); len(diffs) == 0 { matchedIndex = i break } } if matchedIndex != -1 { items = append(items, *canonicalizeNewNoteAttestationHint(c, &d, &nw[matchedIndex])) nw = append(nw[:matchedIndex], nw[matchedIndex+1:]...) } } // Also include elements in nw that are not matched in des. items = append(items, nw...) return items } func canonicalizeNewNoteAttestationHintSlice(c *Client, des, nw []NoteAttestationHint) []NoteAttestationHint { if des == nil { return nw } // Lengths are unequal. A diff will occur later, so we shouldn't canonicalize. // Return the original array. if len(des) != len(nw) { return nw } var items []NoteAttestationHint for i, d := range des { n := nw[i] items = append(items, *canonicalizeNewNoteAttestationHint(c, &d, &n)) } return items } // The differ returns a list of diffs, along with a list of operations that should be taken // to remedy them. Right now, it does not attempt to consolidate operations - if several // fields can be fixed with a patch update, it will perform the patch several times. // Diffs on some fields will be ignored if the `desired` state has an empty (nil) // value. This empty value indicates that the user does not care about the state for // the field. Empty fields on the actual object will cause diffs. // TODO(magic-modules-eng): for efficiency in some resources, add batching. func diffNote(c *Client, desired, actual *Note, opts ...dcl.ApplyOption) ([]*dcl.FieldDiff, error) { if desired == nil || actual == nil { return nil, fmt.Errorf("nil resource passed to diff - always a programming error: %#v, %#v", desired, actual) } c.Config.Logger.Infof("Diff function called with desired state: %v", desired) c.Config.Logger.Infof("Diff function called with actual state: %v", actual) var fn dcl.FieldName var newDiffs []*dcl.FieldDiff // New style diffs. if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.ShortDescription, actual.ShortDescription, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ShortDescription")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.LongDescription, actual.LongDescription, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("LongDescription")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.RelatedUrl, actual.RelatedUrl, dcl.DiffInfo{ObjectFunction: compareNoteRelatedUrlNewStyle, EmptyObject: EmptyNoteRelatedUrl, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("RelatedUrl")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.ExpirationTime, actual.ExpirationTime, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ExpirationTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.CreateTime, actual.CreateTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("CreateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.UpdateTime, actual.UpdateTime, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("UpdateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.RelatedNoteNames, actual.RelatedNoteNames, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("RelatedNoteNames")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Vulnerability, actual.Vulnerability, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityNewStyle, EmptyObject: EmptyNoteVulnerability, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Vulnerability")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Build, actual.Build, dcl.DiffInfo{ObjectFunction: compareNoteBuildNewStyle, EmptyObject: EmptyNoteBuild, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Build")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Image, actual.Image, dcl.DiffInfo{ObjectFunction: compareNoteImageNewStyle, EmptyObject: EmptyNoteImage, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Image")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Package, actual.Package, dcl.DiffInfo{ObjectFunction: compareNotePackageNewStyle, EmptyObject: EmptyNotePackage, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Package")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Discovery, actual.Discovery, dcl.DiffInfo{ObjectFunction: compareNoteDiscoveryNewStyle, EmptyObject: EmptyNoteDiscovery, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Discovery")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Deployment, actual.Deployment, dcl.DiffInfo{ObjectFunction: compareNoteDeploymentNewStyle, EmptyObject: EmptyNoteDeployment, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Deployment")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Attestation, actual.Attestation, dcl.DiffInfo{ObjectFunction: compareNoteAttestationNewStyle, EmptyObject: EmptyNoteAttestation, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Attestation")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } if ds, err := dcl.Diff(desired.Project, actual.Project, dcl.DiffInfo{Type: "ReferenceType", OperationSelector: dcl.RequiresRecreate()}, fn.AddNest("Project")); len(ds) != 0 || err != nil { if err != nil { return nil, err } newDiffs = append(newDiffs, ds...) } newDiffs = analyzeNoteDiff(desired, actual, newDiffs) if len(newDiffs) > 0 { c.Config.Logger.Infof("Diff function found diffs: %v", newDiffs) } return newDiffs, nil } func compareNoteRelatedUrlNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteRelatedUrl) if !ok { desiredNotPointer, ok := d.(NoteRelatedUrl) if !ok { return nil, fmt.Errorf("obj %v is not a NoteRelatedUrl or *NoteRelatedUrl", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteRelatedUrl) if !ok { actualNotPointer, ok := a.(NoteRelatedUrl) if !ok { return nil, fmt.Errorf("obj %v is not a NoteRelatedUrl", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Url, actual.Url, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Url")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Label, actual.Label, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Label")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerability) if !ok { desiredNotPointer, ok := d.(NoteVulnerability) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerability or *NoteVulnerability", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerability) if !ok { actualNotPointer, ok := a.(NoteVulnerability) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerability", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.CvssScore, actual.CvssScore, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("CvssScore")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Severity, actual.Severity, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Severity")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Details, actual.Details, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityDetailsNewStyle, EmptyObject: EmptyNoteVulnerabilityDetails, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Details")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.CvssV3, actual.CvssV3, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityCvssV3NewStyle, EmptyObject: EmptyNoteVulnerabilityCvssV3, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("CvssV3")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.WindowsDetails, actual.WindowsDetails, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityWindowsDetailsNewStyle, EmptyObject: EmptyNoteVulnerabilityWindowsDetails, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("WindowsDetails")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.SourceUpdateTime, actual.SourceUpdateTime, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("SourceUpdateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityDetailsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityDetails) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityDetails) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetails or *NoteVulnerabilityDetails", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityDetails) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityDetails) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetails", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.SeverityName, actual.SeverityName, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("SeverityName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Description, actual.Description, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Description")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.PackageType, actual.PackageType, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("PackageType")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AffectedCpeUri, actual.AffectedCpeUri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AffectedCpeUri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AffectedPackage, actual.AffectedPackage, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AffectedPackage")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AffectedVersionStart, actual.AffectedVersionStart, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityDetailsAffectedVersionStartNewStyle, EmptyObject: EmptyNoteVulnerabilityDetailsAffectedVersionStart, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AffectedVersionStart")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AffectedVersionEnd, actual.AffectedVersionEnd, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityDetailsAffectedVersionEndNewStyle, EmptyObject: EmptyNoteVulnerabilityDetailsAffectedVersionEnd, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AffectedVersionEnd")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FixedCpeUri, actual.FixedCpeUri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FixedCpeUri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FixedPackage, actual.FixedPackage, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FixedPackage")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FixedVersion, actual.FixedVersion, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityDetailsFixedVersionNewStyle, EmptyObject: EmptyNoteVulnerabilityDetailsFixedVersion, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FixedVersion")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.IsObsolete, actual.IsObsolete, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("IsObsolete")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.SourceUpdateTime, actual.SourceUpdateTime, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("SourceUpdateTime")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityDetailsAffectedVersionStartNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityDetailsAffectedVersionStart) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityDetailsAffectedVersionStart) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsAffectedVersionStart or *NoteVulnerabilityDetailsAffectedVersionStart", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityDetailsAffectedVersionStart) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityDetailsAffectedVersionStart) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsAffectedVersionStart", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Epoch, actual.Epoch, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Epoch")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Kind, actual.Kind, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Kind")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FullName, actual.FullName, dcl.DiffInfo{ServerDefault: true, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FullName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityDetailsAffectedVersionEndNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityDetailsAffectedVersionEnd) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityDetailsAffectedVersionEnd) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsAffectedVersionEnd or *NoteVulnerabilityDetailsAffectedVersionEnd", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityDetailsAffectedVersionEnd) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityDetailsAffectedVersionEnd) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsAffectedVersionEnd", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Epoch, actual.Epoch, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Epoch")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Kind, actual.Kind, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Kind")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FullName, actual.FullName, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FullName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityDetailsFixedVersionNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityDetailsFixedVersion) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityDetailsFixedVersion) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsFixedVersion or *NoteVulnerabilityDetailsFixedVersion", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityDetailsFixedVersion) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityDetailsFixedVersion) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityDetailsFixedVersion", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Epoch, actual.Epoch, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Epoch")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Kind, actual.Kind, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Kind")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FullName, actual.FullName, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FullName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityCvssV3NewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityCvssV3) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityCvssV3) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityCvssV3 or *NoteVulnerabilityCvssV3", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityCvssV3) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityCvssV3) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityCvssV3", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.BaseScore, actual.BaseScore, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("BaseScore")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ExploitabilityScore, actual.ExploitabilityScore, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ExploitabilityScore")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ImpactScore, actual.ImpactScore, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ImpactScore")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AttackVector, actual.AttackVector, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AttackVector")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AttackComplexity, actual.AttackComplexity, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AttackComplexity")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.PrivilegesRequired, actual.PrivilegesRequired, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("PrivilegesRequired")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.UserInteraction, actual.UserInteraction, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("UserInteraction")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Scope, actual.Scope, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Scope")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.ConfidentialityImpact, actual.ConfidentialityImpact, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ConfidentialityImpact")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.IntegrityImpact, actual.IntegrityImpact, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("IntegrityImpact")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.AvailabilityImpact, actual.AvailabilityImpact, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AvailabilityImpact")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityWindowsDetailsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityWindowsDetails) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityWindowsDetails) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityWindowsDetails or *NoteVulnerabilityWindowsDetails", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityWindowsDetails) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityWindowsDetails) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityWindowsDetails", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.CpeUri, actual.CpeUri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("CpeUri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Description, actual.Description, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Description")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FixingKbs, actual.FixingKbs, dcl.DiffInfo{ObjectFunction: compareNoteVulnerabilityWindowsDetailsFixingKbsNewStyle, EmptyObject: EmptyNoteVulnerabilityWindowsDetailsFixingKbs, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FixingKbs")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteVulnerabilityWindowsDetailsFixingKbsNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteVulnerabilityWindowsDetailsFixingKbs) if !ok { desiredNotPointer, ok := d.(NoteVulnerabilityWindowsDetailsFixingKbs) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityWindowsDetailsFixingKbs or *NoteVulnerabilityWindowsDetailsFixingKbs", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteVulnerabilityWindowsDetailsFixingKbs) if !ok { actualNotPointer, ok := a.(NoteVulnerabilityWindowsDetailsFixingKbs) if !ok { return nil, fmt.Errorf("obj %v is not a NoteVulnerabilityWindowsDetailsFixingKbs", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Url, actual.Url, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Url")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteBuildNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteBuild) if !ok { desiredNotPointer, ok := d.(NoteBuild) if !ok { return nil, fmt.Errorf("obj %v is not a NoteBuild or *NoteBuild", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteBuild) if !ok { actualNotPointer, ok := a.(NoteBuild) if !ok { return nil, fmt.Errorf("obj %v is not a NoteBuild", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.BuilderVersion, actual.BuilderVersion, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("BuilderVersion")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Signature, actual.Signature, dcl.DiffInfo{ObjectFunction: compareNoteBuildSignatureNewStyle, EmptyObject: EmptyNoteBuildSignature, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Signature")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteBuildSignatureNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteBuildSignature) if !ok { desiredNotPointer, ok := d.(NoteBuildSignature) if !ok { return nil, fmt.Errorf("obj %v is not a NoteBuildSignature or *NoteBuildSignature", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteBuildSignature) if !ok { actualNotPointer, ok := a.(NoteBuildSignature) if !ok { return nil, fmt.Errorf("obj %v is not a NoteBuildSignature", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.PublicKey, actual.PublicKey, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("PublicKey")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Signature, actual.Signature, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Signature")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.KeyId, actual.KeyId, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("KeyId")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.KeyType, actual.KeyType, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("KeyType")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteImageNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteImage) if !ok { desiredNotPointer, ok := d.(NoteImage) if !ok { return nil, fmt.Errorf("obj %v is not a NoteImage or *NoteImage", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteImage) if !ok { actualNotPointer, ok := a.(NoteImage) if !ok { return nil, fmt.Errorf("obj %v is not a NoteImage", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.ResourceUrl, actual.ResourceUrl, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ResourceUrl")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Fingerprint, actual.Fingerprint, dcl.DiffInfo{ObjectFunction: compareNoteImageFingerprintNewStyle, EmptyObject: EmptyNoteImageFingerprint, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Fingerprint")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteImageFingerprintNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteImageFingerprint) if !ok { desiredNotPointer, ok := d.(NoteImageFingerprint) if !ok { return nil, fmt.Errorf("obj %v is not a NoteImageFingerprint or *NoteImageFingerprint", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteImageFingerprint) if !ok { actualNotPointer, ok := a.(NoteImageFingerprint) if !ok { return nil, fmt.Errorf("obj %v is not a NoteImageFingerprint", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.V1Name, actual.V1Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("V1Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.V2Blob, actual.V2Blob, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("V2Blob")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.V2Name, actual.V2Name, dcl.DiffInfo{OutputOnly: true, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("V2Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNotePackageNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NotePackage) if !ok { desiredNotPointer, ok := d.(NotePackage) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackage or *NotePackage", d) } desired = &desiredNotPointer } actual, ok := a.(*NotePackage) if !ok { actualNotPointer, ok := a.(NotePackage) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackage", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Distribution, actual.Distribution, dcl.DiffInfo{ObjectFunction: compareNotePackageDistributionNewStyle, EmptyObject: EmptyNotePackageDistribution, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Distribution")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNotePackageDistributionNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NotePackageDistribution) if !ok { desiredNotPointer, ok := d.(NotePackageDistribution) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackageDistribution or *NotePackageDistribution", d) } desired = &desiredNotPointer } actual, ok := a.(*NotePackageDistribution) if !ok { actualNotPointer, ok := a.(NotePackageDistribution) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackageDistribution", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.CpeUri, actual.CpeUri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("CpeUri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Architecture, actual.Architecture, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Architecture")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.LatestVersion, actual.LatestVersion, dcl.DiffInfo{ObjectFunction: compareNotePackageDistributionLatestVersionNewStyle, EmptyObject: EmptyNotePackageDistributionLatestVersion, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("LatestVersion")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Maintainer, actual.Maintainer, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Maintainer")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Url, actual.Url, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Url")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Description, actual.Description, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Description")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNotePackageDistributionLatestVersionNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NotePackageDistributionLatestVersion) if !ok { desiredNotPointer, ok := d.(NotePackageDistributionLatestVersion) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackageDistributionLatestVersion or *NotePackageDistributionLatestVersion", d) } desired = &desiredNotPointer } actual, ok := a.(*NotePackageDistributionLatestVersion) if !ok { actualNotPointer, ok := a.(NotePackageDistributionLatestVersion) if !ok { return nil, fmt.Errorf("obj %v is not a NotePackageDistributionLatestVersion", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Epoch, actual.Epoch, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Epoch")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Name, actual.Name, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Name")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Revision, actual.Revision, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Revision")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.Kind, actual.Kind, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Kind")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } if ds, err := dcl.Diff(desired.FullName, actual.FullName, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("FullName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteDiscoveryNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteDiscovery) if !ok { desiredNotPointer, ok := d.(NoteDiscovery) if !ok { return nil, fmt.Errorf("obj %v is not a NoteDiscovery or *NoteDiscovery", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteDiscovery) if !ok { actualNotPointer, ok := a.(NoteDiscovery) if !ok { return nil, fmt.Errorf("obj %v is not a NoteDiscovery", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.AnalysisKind, actual.AnalysisKind, dcl.DiffInfo{Type: "EnumType", OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("AnalysisKind")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteDeploymentNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteDeployment) if !ok { desiredNotPointer, ok := d.(NoteDeployment) if !ok { return nil, fmt.Errorf("obj %v is not a NoteDeployment or *NoteDeployment", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteDeployment) if !ok { actualNotPointer, ok := a.(NoteDeployment) if !ok { return nil, fmt.Errorf("obj %v is not a NoteDeployment", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.ResourceUri, actual.ResourceUri, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("ResourceUri")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteAttestationNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteAttestation) if !ok { desiredNotPointer, ok := d.(NoteAttestation) if !ok { return nil, fmt.Errorf("obj %v is not a NoteAttestation or *NoteAttestation", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteAttestation) if !ok { actualNotPointer, ok := a.(NoteAttestation) if !ok { return nil, fmt.Errorf("obj %v is not a NoteAttestation", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.Hint, actual.Hint, dcl.DiffInfo{ObjectFunction: compareNoteAttestationHintNewStyle, EmptyObject: EmptyNoteAttestationHint, OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("Hint")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } func compareNoteAttestationHintNewStyle(d, a interface{}, fn dcl.FieldName) ([]*dcl.FieldDiff, error) { var diffs []*dcl.FieldDiff desired, ok := d.(*NoteAttestationHint) if !ok { desiredNotPointer, ok := d.(NoteAttestationHint) if !ok { return nil, fmt.Errorf("obj %v is not a NoteAttestationHint or *NoteAttestationHint", d) } desired = &desiredNotPointer } actual, ok := a.(*NoteAttestationHint) if !ok { actualNotPointer, ok := a.(NoteAttestationHint) if !ok { return nil, fmt.Errorf("obj %v is not a NoteAttestationHint", a) } actual = &actualNotPointer } if ds, err := dcl.Diff(desired.HumanReadableName, actual.HumanReadableName, dcl.DiffInfo{OperationSelector: dcl.TriggersOperation("updateNoteUpdateNoteOperation")}, fn.AddNest("HumanReadableName")); len(ds) != 0 || err != nil { if err != nil { return nil, err } diffs = append(diffs, ds...) } return diffs, nil } // urlNormalized returns a copy of the resource struct with values normalized // for URL substitutions. For instance, it converts long-form self-links to // short-form so they can be substituted in. func (r *Note) urlNormalized() *Note { normalized := dcl.Copy(*r).(Note) normalized.Name = dcl.SelfLinkToName(r.Name) normalized.ShortDescription = dcl.SelfLinkToName(r.ShortDescription) normalized.LongDescription = dcl.SelfLinkToName(r.LongDescription) normalized.Project = dcl.SelfLinkToName(r.Project) return &normalized } func (r *Note) updateURL(userBasePath, updateName string) (string, error) { nr := r.urlNormalized() if updateName == "UpdateNote" { fields := map[string]interface{}{ "project": dcl.ValueOrEmptyString(nr.Project), "name": dcl.ValueOrEmptyString(nr.Name), } return dcl.URL("projects/{{project}}/notes/{{name}}", nr.basePath(), userBasePath, fields), nil } return "", fmt.Errorf("unknown update name: %s", updateName) } // marshal encodes the Note resource into JSON for a Create request, and // performs transformations from the resource schema to the API schema if // necessary. func (r *Note) marshal(c *Client) ([]byte, error) { m, err := expandNote(c, r) if err != nil { return nil, fmt.Errorf("error marshalling Note: %w", err) } return json.Marshal(m) } // unmarshalNote decodes JSON responses into the Note resource schema. func unmarshalNote(b []byte, c *Client, res *Note) (*Note, error) { var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } return unmarshalMapNote(m, c, res) } func unmarshalMapNote(m map[string]interface{}, c *Client, res *Note) (*Note, error) { flattened := flattenNote(c, m, res) if flattened == nil { return nil, fmt.Errorf("attempted to flatten empty json object") } return flattened, nil } // expandNote expands Note into a JSON request object. func expandNote(c *Client, f *Note) (map[string]interface{}, error) { m := make(map[string]interface{}) res := f _ = res if v, err := dcl.DeriveField("projects/%s/notes/%s", f.Name, dcl.SelfLinkToName(f.Project), dcl.SelfLinkToName(f.Name)); err != nil { return nil, fmt.Errorf("error expanding Name into name: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.ShortDescription; dcl.ValueShouldBeSent(v) { m["shortDescription"] = v } if v := f.LongDescription; dcl.ValueShouldBeSent(v) { m["longDescription"] = v } if v, err := expandNoteRelatedUrlSlice(c, f.RelatedUrl, res); err != nil { return nil, fmt.Errorf("error expanding RelatedUrl into relatedUrl: %w", err) } else if v != nil { m["relatedUrl"] = v } if v := f.ExpirationTime; dcl.ValueShouldBeSent(v) { m["expirationTime"] = v } if v := f.RelatedNoteNames; v != nil { m["relatedNoteNames"] = v } if v, err := expandNoteVulnerability(c, f.Vulnerability, res); err != nil { return nil, fmt.Errorf("error expanding Vulnerability into vulnerability: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["vulnerability"] = v } if v, err := expandNoteBuild(c, f.Build, res); err != nil { return nil, fmt.Errorf("error expanding Build into build: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["build"] = v } if v, err := expandNoteImage(c, f.Image, res); err != nil { return nil, fmt.Errorf("error expanding Image into image: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["image"] = v } if v, err := expandNotePackage(c, f.Package, res); err != nil { return nil, fmt.Errorf("error expanding Package into package: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["package"] = v } if v, err := expandNoteDiscovery(c, f.Discovery, res); err != nil { return nil, fmt.Errorf("error expanding Discovery into discovery: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["discovery"] = v } if v, err := expandNoteDeployment(c, f.Deployment, res); err != nil { return nil, fmt.Errorf("error expanding Deployment into deployment: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["deployment"] = v } if v, err := expandNoteAttestation(c, f.Attestation, res); err != nil { return nil, fmt.Errorf("error expanding Attestation into attestation: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["attestation"] = v } if v, err := dcl.EmptyValue(); err != nil { return nil, fmt.Errorf("error expanding Project into project: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["project"] = v } return m, nil } // flattenNote flattens Note from a JSON request object into the // Note type. func flattenNote(c *Client, i interface{}, res *Note) *Note { m, ok := i.(map[string]interface{}) if !ok { return nil } if len(m) == 0 { return nil } resultRes := &Note{} resultRes.Name = dcl.FlattenString(m["name"]) resultRes.ShortDescription = dcl.FlattenString(m["shortDescription"]) resultRes.LongDescription = dcl.FlattenString(m["longDescription"]) resultRes.RelatedUrl = flattenNoteRelatedUrlSlice(c, m["relatedUrl"], res) resultRes.ExpirationTime = dcl.FlattenString(m["expirationTime"]) resultRes.CreateTime = dcl.FlattenString(m["createTime"]) resultRes.UpdateTime = dcl.FlattenString(m["updateTime"]) resultRes.RelatedNoteNames = dcl.FlattenStringSlice(m["relatedNoteNames"]) resultRes.Vulnerability = flattenNoteVulnerability(c, m["vulnerability"], res) resultRes.Build = flattenNoteBuild(c, m["build"], res) resultRes.Image = flattenNoteImage(c, m["image"], res) resultRes.Package = flattenNotePackage(c, m["package"], res) resultRes.Discovery = flattenNoteDiscovery(c, m["discovery"], res) resultRes.Deployment = flattenNoteDeployment(c, m["deployment"], res) resultRes.Attestation = flattenNoteAttestation(c, m["attestation"], res) resultRes.Project = dcl.FlattenString(m["project"]) return resultRes } // expandNoteRelatedUrlMap expands the contents of NoteRelatedUrl into a JSON // request object. func expandNoteRelatedUrlMap(c *Client, f map[string]NoteRelatedUrl, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteRelatedUrl(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteRelatedUrlSlice expands the contents of NoteRelatedUrl into a JSON // request object. func expandNoteRelatedUrlSlice(c *Client, f []NoteRelatedUrl, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteRelatedUrl(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteRelatedUrlMap flattens the contents of NoteRelatedUrl from a JSON // response object. func flattenNoteRelatedUrlMap(c *Client, i interface{}, res *Note) map[string]NoteRelatedUrl { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteRelatedUrl{} } if len(a) == 0 { return map[string]NoteRelatedUrl{} } items := make(map[string]NoteRelatedUrl) for k, item := range a { items[k] = *flattenNoteRelatedUrl(c, item.(map[string]interface{}), res) } return items } // flattenNoteRelatedUrlSlice flattens the contents of NoteRelatedUrl from a JSON // response object. func flattenNoteRelatedUrlSlice(c *Client, i interface{}, res *Note) []NoteRelatedUrl { a, ok := i.([]interface{}) if !ok { return []NoteRelatedUrl{} } if len(a) == 0 { return []NoteRelatedUrl{} } items := make([]NoteRelatedUrl, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteRelatedUrl(c, item.(map[string]interface{}), res)) } return items } // expandNoteRelatedUrl expands an instance of NoteRelatedUrl into a JSON // request object. func expandNoteRelatedUrl(c *Client, f *NoteRelatedUrl, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Url; !dcl.IsEmptyValueIndirect(v) { m["url"] = v } if v := f.Label; !dcl.IsEmptyValueIndirect(v) { m["label"] = v } return m, nil } // flattenNoteRelatedUrl flattens an instance of NoteRelatedUrl from a JSON // response object. func flattenNoteRelatedUrl(c *Client, i interface{}, res *Note) *NoteRelatedUrl { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteRelatedUrl{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteRelatedUrl } r.Url = dcl.FlattenString(m["url"]) r.Label = dcl.FlattenString(m["label"]) return r } // expandNoteVulnerabilityMap expands the contents of NoteVulnerability into a JSON // request object. func expandNoteVulnerabilityMap(c *Client, f map[string]NoteVulnerability, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerability(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilitySlice expands the contents of NoteVulnerability into a JSON // request object. func expandNoteVulnerabilitySlice(c *Client, f []NoteVulnerability, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerability(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityMap flattens the contents of NoteVulnerability from a JSON // response object. func flattenNoteVulnerabilityMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerability { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerability{} } if len(a) == 0 { return map[string]NoteVulnerability{} } items := make(map[string]NoteVulnerability) for k, item := range a { items[k] = *flattenNoteVulnerability(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilitySlice flattens the contents of NoteVulnerability from a JSON // response object. func flattenNoteVulnerabilitySlice(c *Client, i interface{}, res *Note) []NoteVulnerability { a, ok := i.([]interface{}) if !ok { return []NoteVulnerability{} } if len(a) == 0 { return []NoteVulnerability{} } items := make([]NoteVulnerability, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerability(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerability expands an instance of NoteVulnerability into a JSON // request object. func expandNoteVulnerability(c *Client, f *NoteVulnerability, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.CvssScore; !dcl.IsEmptyValueIndirect(v) { m["cvssScore"] = v } if v := f.Severity; !dcl.IsEmptyValueIndirect(v) { m["severity"] = v } if v, err := expandNoteVulnerabilityDetailsSlice(c, f.Details, res); err != nil { return nil, fmt.Errorf("error expanding Details into details: %w", err) } else if v != nil { m["details"] = v } if v, err := expandNoteVulnerabilityCvssV3(c, f.CvssV3, res); err != nil { return nil, fmt.Errorf("error expanding CvssV3 into cvssV3: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["cvssV3"] = v } if v, err := expandNoteVulnerabilityWindowsDetailsSlice(c, f.WindowsDetails, res); err != nil { return nil, fmt.Errorf("error expanding WindowsDetails into windowsDetails: %w", err) } else if v != nil { m["windowsDetails"] = v } if v := f.SourceUpdateTime; !dcl.IsEmptyValueIndirect(v) { m["sourceUpdateTime"] = v } return m, nil } // flattenNoteVulnerability flattens an instance of NoteVulnerability from a JSON // response object. func flattenNoteVulnerability(c *Client, i interface{}, res *Note) *NoteVulnerability { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerability{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerability } r.CvssScore = dcl.FlattenDouble(m["cvssScore"]) r.Severity = flattenNoteVulnerabilitySeverityEnum(m["severity"]) r.Details = flattenNoteVulnerabilityDetailsSlice(c, m["details"], res) r.CvssV3 = flattenNoteVulnerabilityCvssV3(c, m["cvssV3"], res) r.WindowsDetails = flattenNoteVulnerabilityWindowsDetailsSlice(c, m["windowsDetails"], res) r.SourceUpdateTime = dcl.FlattenString(m["sourceUpdateTime"]) return r } // expandNoteVulnerabilityDetailsMap expands the contents of NoteVulnerabilityDetails into a JSON // request object. func expandNoteVulnerabilityDetailsMap(c *Client, f map[string]NoteVulnerabilityDetails, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityDetails(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityDetailsSlice expands the contents of NoteVulnerabilityDetails into a JSON // request object. func expandNoteVulnerabilityDetailsSlice(c *Client, f []NoteVulnerabilityDetails, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityDetails(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityDetailsMap flattens the contents of NoteVulnerabilityDetails from a JSON // response object. func flattenNoteVulnerabilityDetailsMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetails { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetails{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetails{} } items := make(map[string]NoteVulnerabilityDetails) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetails(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityDetailsSlice flattens the contents of NoteVulnerabilityDetails from a JSON // response object. func flattenNoteVulnerabilityDetailsSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetails { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetails{} } if len(a) == 0 { return []NoteVulnerabilityDetails{} } items := make([]NoteVulnerabilityDetails, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetails(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityDetails expands an instance of NoteVulnerabilityDetails into a JSON // request object. func expandNoteVulnerabilityDetails(c *Client, f *NoteVulnerabilityDetails, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.SeverityName; !dcl.IsEmptyValueIndirect(v) { m["severityName"] = v } if v := f.Description; !dcl.IsEmptyValueIndirect(v) { m["description"] = v } if v := f.PackageType; !dcl.IsEmptyValueIndirect(v) { m["packageType"] = v } if v := f.AffectedCpeUri; !dcl.IsEmptyValueIndirect(v) { m["affectedCpeUri"] = v } if v := f.AffectedPackage; !dcl.IsEmptyValueIndirect(v) { m["affectedPackage"] = v } if v, err := expandNoteVulnerabilityDetailsAffectedVersionStart(c, f.AffectedVersionStart, res); err != nil { return nil, fmt.Errorf("error expanding AffectedVersionStart into affectedVersionStart: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["affectedVersionStart"] = v } if v, err := expandNoteVulnerabilityDetailsAffectedVersionEnd(c, f.AffectedVersionEnd, res); err != nil { return nil, fmt.Errorf("error expanding AffectedVersionEnd into affectedVersionEnd: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["affectedVersionEnd"] = v } if v := f.FixedCpeUri; !dcl.IsEmptyValueIndirect(v) { m["fixedCpeUri"] = v } if v := f.FixedPackage; !dcl.IsEmptyValueIndirect(v) { m["fixedPackage"] = v } if v, err := expandNoteVulnerabilityDetailsFixedVersion(c, f.FixedVersion, res); err != nil { return nil, fmt.Errorf("error expanding FixedVersion into fixedVersion: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["fixedVersion"] = v } if v := f.IsObsolete; !dcl.IsEmptyValueIndirect(v) { m["isObsolete"] = v } if v := f.SourceUpdateTime; !dcl.IsEmptyValueIndirect(v) { m["sourceUpdateTime"] = v } return m, nil } // flattenNoteVulnerabilityDetails flattens an instance of NoteVulnerabilityDetails from a JSON // response object. func flattenNoteVulnerabilityDetails(c *Client, i interface{}, res *Note) *NoteVulnerabilityDetails { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityDetails{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityDetails } r.SeverityName = dcl.FlattenString(m["severityName"]) r.Description = dcl.FlattenString(m["description"]) r.PackageType = dcl.FlattenString(m["packageType"]) r.AffectedCpeUri = dcl.FlattenString(m["affectedCpeUri"]) r.AffectedPackage = dcl.FlattenString(m["affectedPackage"]) r.AffectedVersionStart = flattenNoteVulnerabilityDetailsAffectedVersionStart(c, m["affectedVersionStart"], res) r.AffectedVersionEnd = flattenNoteVulnerabilityDetailsAffectedVersionEnd(c, m["affectedVersionEnd"], res) r.FixedCpeUri = dcl.FlattenString(m["fixedCpeUri"]) r.FixedPackage = dcl.FlattenString(m["fixedPackage"]) r.FixedVersion = flattenNoteVulnerabilityDetailsFixedVersion(c, m["fixedVersion"], res) r.IsObsolete = dcl.FlattenBool(m["isObsolete"]) r.SourceUpdateTime = dcl.FlattenString(m["sourceUpdateTime"]) return r } // expandNoteVulnerabilityDetailsAffectedVersionStartMap expands the contents of NoteVulnerabilityDetailsAffectedVersionStart into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionStartMap(c *Client, f map[string]NoteVulnerabilityDetailsAffectedVersionStart, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityDetailsAffectedVersionStart(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityDetailsAffectedVersionStartSlice expands the contents of NoteVulnerabilityDetailsAffectedVersionStart into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionStartSlice(c *Client, f []NoteVulnerabilityDetailsAffectedVersionStart, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityDetailsAffectedVersionStart(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityDetailsAffectedVersionStartMap flattens the contents of NoteVulnerabilityDetailsAffectedVersionStart from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionStartMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsAffectedVersionStart { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsAffectedVersionStart{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsAffectedVersionStart{} } items := make(map[string]NoteVulnerabilityDetailsAffectedVersionStart) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsAffectedVersionStart(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionStartSlice flattens the contents of NoteVulnerabilityDetailsAffectedVersionStart from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionStartSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsAffectedVersionStart { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsAffectedVersionStart{} } if len(a) == 0 { return []NoteVulnerabilityDetailsAffectedVersionStart{} } items := make([]NoteVulnerabilityDetailsAffectedVersionStart, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsAffectedVersionStart(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityDetailsAffectedVersionStart expands an instance of NoteVulnerabilityDetailsAffectedVersionStart into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionStart(c *Client, f *NoteVulnerabilityDetailsAffectedVersionStart, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Epoch; !dcl.IsEmptyValueIndirect(v) { m["epoch"] = v } if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Kind; !dcl.IsEmptyValueIndirect(v) { m["kind"] = v } if v := f.FullName; !dcl.IsEmptyValueIndirect(v) { m["fullName"] = v } return m, nil } // flattenNoteVulnerabilityDetailsAffectedVersionStart flattens an instance of NoteVulnerabilityDetailsAffectedVersionStart from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionStart(c *Client, i interface{}, res *Note) *NoteVulnerabilityDetailsAffectedVersionStart { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityDetailsAffectedVersionStart{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityDetailsAffectedVersionStart } r.Epoch = dcl.FlattenInteger(m["epoch"]) r.Name = dcl.FlattenString(m["name"]) r.Revision = dcl.FlattenString(m["revision"]) r.Kind = flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnum(m["kind"]) r.FullName = dcl.FlattenString(m["fullName"]) return r } // expandNoteVulnerabilityDetailsAffectedVersionEndMap expands the contents of NoteVulnerabilityDetailsAffectedVersionEnd into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionEndMap(c *Client, f map[string]NoteVulnerabilityDetailsAffectedVersionEnd, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityDetailsAffectedVersionEnd(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityDetailsAffectedVersionEndSlice expands the contents of NoteVulnerabilityDetailsAffectedVersionEnd into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionEndSlice(c *Client, f []NoteVulnerabilityDetailsAffectedVersionEnd, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityDetailsAffectedVersionEnd(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityDetailsAffectedVersionEndMap flattens the contents of NoteVulnerabilityDetailsAffectedVersionEnd from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionEndMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsAffectedVersionEnd { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsAffectedVersionEnd{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsAffectedVersionEnd{} } items := make(map[string]NoteVulnerabilityDetailsAffectedVersionEnd) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsAffectedVersionEnd(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionEndSlice flattens the contents of NoteVulnerabilityDetailsAffectedVersionEnd from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionEndSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsAffectedVersionEnd { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsAffectedVersionEnd{} } if len(a) == 0 { return []NoteVulnerabilityDetailsAffectedVersionEnd{} } items := make([]NoteVulnerabilityDetailsAffectedVersionEnd, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsAffectedVersionEnd(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityDetailsAffectedVersionEnd expands an instance of NoteVulnerabilityDetailsAffectedVersionEnd into a JSON // request object. func expandNoteVulnerabilityDetailsAffectedVersionEnd(c *Client, f *NoteVulnerabilityDetailsAffectedVersionEnd, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Epoch; !dcl.IsEmptyValueIndirect(v) { m["epoch"] = v } if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Kind; !dcl.IsEmptyValueIndirect(v) { m["kind"] = v } if v := f.FullName; !dcl.IsEmptyValueIndirect(v) { m["fullName"] = v } return m, nil } // flattenNoteVulnerabilityDetailsAffectedVersionEnd flattens an instance of NoteVulnerabilityDetailsAffectedVersionEnd from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionEnd(c *Client, i interface{}, res *Note) *NoteVulnerabilityDetailsAffectedVersionEnd { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityDetailsAffectedVersionEnd{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityDetailsAffectedVersionEnd } r.Epoch = dcl.FlattenInteger(m["epoch"]) r.Name = dcl.FlattenString(m["name"]) r.Revision = dcl.FlattenString(m["revision"]) r.Kind = flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnum(m["kind"]) r.FullName = dcl.FlattenString(m["fullName"]) return r } // expandNoteVulnerabilityDetailsFixedVersionMap expands the contents of NoteVulnerabilityDetailsFixedVersion into a JSON // request object. func expandNoteVulnerabilityDetailsFixedVersionMap(c *Client, f map[string]NoteVulnerabilityDetailsFixedVersion, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityDetailsFixedVersion(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityDetailsFixedVersionSlice expands the contents of NoteVulnerabilityDetailsFixedVersion into a JSON // request object. func expandNoteVulnerabilityDetailsFixedVersionSlice(c *Client, f []NoteVulnerabilityDetailsFixedVersion, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityDetailsFixedVersion(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityDetailsFixedVersionMap flattens the contents of NoteVulnerabilityDetailsFixedVersion from a JSON // response object. func flattenNoteVulnerabilityDetailsFixedVersionMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsFixedVersion { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsFixedVersion{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsFixedVersion{} } items := make(map[string]NoteVulnerabilityDetailsFixedVersion) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsFixedVersion(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityDetailsFixedVersionSlice flattens the contents of NoteVulnerabilityDetailsFixedVersion from a JSON // response object. func flattenNoteVulnerabilityDetailsFixedVersionSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsFixedVersion { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsFixedVersion{} } if len(a) == 0 { return []NoteVulnerabilityDetailsFixedVersion{} } items := make([]NoteVulnerabilityDetailsFixedVersion, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsFixedVersion(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityDetailsFixedVersion expands an instance of NoteVulnerabilityDetailsFixedVersion into a JSON // request object. func expandNoteVulnerabilityDetailsFixedVersion(c *Client, f *NoteVulnerabilityDetailsFixedVersion, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Epoch; !dcl.IsEmptyValueIndirect(v) { m["epoch"] = v } if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Kind; !dcl.IsEmptyValueIndirect(v) { m["kind"] = v } if v := f.FullName; !dcl.IsEmptyValueIndirect(v) { m["fullName"] = v } return m, nil } // flattenNoteVulnerabilityDetailsFixedVersion flattens an instance of NoteVulnerabilityDetailsFixedVersion from a JSON // response object. func flattenNoteVulnerabilityDetailsFixedVersion(c *Client, i interface{}, res *Note) *NoteVulnerabilityDetailsFixedVersion { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityDetailsFixedVersion{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityDetailsFixedVersion } r.Epoch = dcl.FlattenInteger(m["epoch"]) r.Name = dcl.FlattenString(m["name"]) r.Revision = dcl.FlattenString(m["revision"]) r.Kind = flattenNoteVulnerabilityDetailsFixedVersionKindEnum(m["kind"]) r.FullName = dcl.FlattenString(m["fullName"]) return r } // expandNoteVulnerabilityCvssV3Map expands the contents of NoteVulnerabilityCvssV3 into a JSON // request object. func expandNoteVulnerabilityCvssV3Map(c *Client, f map[string]NoteVulnerabilityCvssV3, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityCvssV3(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityCvssV3Slice expands the contents of NoteVulnerabilityCvssV3 into a JSON // request object. func expandNoteVulnerabilityCvssV3Slice(c *Client, f []NoteVulnerabilityCvssV3, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityCvssV3(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityCvssV3Map flattens the contents of NoteVulnerabilityCvssV3 from a JSON // response object. func flattenNoteVulnerabilityCvssV3Map(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3 { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3{} } items := make(map[string]NoteVulnerabilityCvssV3) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityCvssV3Slice flattens the contents of NoteVulnerabilityCvssV3 from a JSON // response object. func flattenNoteVulnerabilityCvssV3Slice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3 { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3{} } items := make([]NoteVulnerabilityCvssV3, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityCvssV3 expands an instance of NoteVulnerabilityCvssV3 into a JSON // request object. func expandNoteVulnerabilityCvssV3(c *Client, f *NoteVulnerabilityCvssV3, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.BaseScore; !dcl.IsEmptyValueIndirect(v) { m["baseScore"] = v } if v := f.ExploitabilityScore; !dcl.IsEmptyValueIndirect(v) { m["exploitabilityScore"] = v } if v := f.ImpactScore; !dcl.IsEmptyValueIndirect(v) { m["impactScore"] = v } if v := f.AttackVector; !dcl.IsEmptyValueIndirect(v) { m["attackVector"] = v } if v := f.AttackComplexity; !dcl.IsEmptyValueIndirect(v) { m["attackComplexity"] = v } if v := f.PrivilegesRequired; !dcl.IsEmptyValueIndirect(v) { m["privilegesRequired"] = v } if v := f.UserInteraction; !dcl.IsEmptyValueIndirect(v) { m["userInteraction"] = v } if v := f.Scope; !dcl.IsEmptyValueIndirect(v) { m["scope"] = v } if v := f.ConfidentialityImpact; !dcl.IsEmptyValueIndirect(v) { m["confidentialityImpact"] = v } if v := f.IntegrityImpact; !dcl.IsEmptyValueIndirect(v) { m["integrityImpact"] = v } if v := f.AvailabilityImpact; !dcl.IsEmptyValueIndirect(v) { m["availabilityImpact"] = v } return m, nil } // flattenNoteVulnerabilityCvssV3 flattens an instance of NoteVulnerabilityCvssV3 from a JSON // response object. func flattenNoteVulnerabilityCvssV3(c *Client, i interface{}, res *Note) *NoteVulnerabilityCvssV3 { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityCvssV3{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityCvssV3 } r.BaseScore = dcl.FlattenDouble(m["baseScore"]) r.ExploitabilityScore = dcl.FlattenDouble(m["exploitabilityScore"]) r.ImpactScore = dcl.FlattenDouble(m["impactScore"]) r.AttackVector = flattenNoteVulnerabilityCvssV3AttackVectorEnum(m["attackVector"]) r.AttackComplexity = flattenNoteVulnerabilityCvssV3AttackComplexityEnum(m["attackComplexity"]) r.PrivilegesRequired = flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnum(m["privilegesRequired"]) r.UserInteraction = flattenNoteVulnerabilityCvssV3UserInteractionEnum(m["userInteraction"]) r.Scope = flattenNoteVulnerabilityCvssV3ScopeEnum(m["scope"]) r.ConfidentialityImpact = flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnum(m["confidentialityImpact"]) r.IntegrityImpact = flattenNoteVulnerabilityCvssV3IntegrityImpactEnum(m["integrityImpact"]) r.AvailabilityImpact = flattenNoteVulnerabilityCvssV3AvailabilityImpactEnum(m["availabilityImpact"]) return r } // expandNoteVulnerabilityWindowsDetailsMap expands the contents of NoteVulnerabilityWindowsDetails into a JSON // request object. func expandNoteVulnerabilityWindowsDetailsMap(c *Client, f map[string]NoteVulnerabilityWindowsDetails, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityWindowsDetails(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityWindowsDetailsSlice expands the contents of NoteVulnerabilityWindowsDetails into a JSON // request object. func expandNoteVulnerabilityWindowsDetailsSlice(c *Client, f []NoteVulnerabilityWindowsDetails, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityWindowsDetails(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityWindowsDetailsMap flattens the contents of NoteVulnerabilityWindowsDetails from a JSON // response object. func flattenNoteVulnerabilityWindowsDetailsMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityWindowsDetails { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityWindowsDetails{} } if len(a) == 0 { return map[string]NoteVulnerabilityWindowsDetails{} } items := make(map[string]NoteVulnerabilityWindowsDetails) for k, item := range a { items[k] = *flattenNoteVulnerabilityWindowsDetails(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityWindowsDetailsSlice flattens the contents of NoteVulnerabilityWindowsDetails from a JSON // response object. func flattenNoteVulnerabilityWindowsDetailsSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityWindowsDetails { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityWindowsDetails{} } if len(a) == 0 { return []NoteVulnerabilityWindowsDetails{} } items := make([]NoteVulnerabilityWindowsDetails, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityWindowsDetails(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityWindowsDetails expands an instance of NoteVulnerabilityWindowsDetails into a JSON // request object. func expandNoteVulnerabilityWindowsDetails(c *Client, f *NoteVulnerabilityWindowsDetails, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.CpeUri; !dcl.IsEmptyValueIndirect(v) { m["cpeUri"] = v } if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Description; !dcl.IsEmptyValueIndirect(v) { m["description"] = v } if v, err := expandNoteVulnerabilityWindowsDetailsFixingKbsSlice(c, f.FixingKbs, res); err != nil { return nil, fmt.Errorf("error expanding FixingKbs into fixingKbs: %w", err) } else if v != nil { m["fixingKbs"] = v } return m, nil } // flattenNoteVulnerabilityWindowsDetails flattens an instance of NoteVulnerabilityWindowsDetails from a JSON // response object. func flattenNoteVulnerabilityWindowsDetails(c *Client, i interface{}, res *Note) *NoteVulnerabilityWindowsDetails { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityWindowsDetails{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityWindowsDetails } r.CpeUri = dcl.FlattenString(m["cpeUri"]) r.Name = dcl.FlattenString(m["name"]) r.Description = dcl.FlattenString(m["description"]) r.FixingKbs = flattenNoteVulnerabilityWindowsDetailsFixingKbsSlice(c, m["fixingKbs"], res) return r } // expandNoteVulnerabilityWindowsDetailsFixingKbsMap expands the contents of NoteVulnerabilityWindowsDetailsFixingKbs into a JSON // request object. func expandNoteVulnerabilityWindowsDetailsFixingKbsMap(c *Client, f map[string]NoteVulnerabilityWindowsDetailsFixingKbs, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteVulnerabilityWindowsDetailsFixingKbs(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteVulnerabilityWindowsDetailsFixingKbsSlice expands the contents of NoteVulnerabilityWindowsDetailsFixingKbs into a JSON // request object. func expandNoteVulnerabilityWindowsDetailsFixingKbsSlice(c *Client, f []NoteVulnerabilityWindowsDetailsFixingKbs, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteVulnerabilityWindowsDetailsFixingKbs(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteVulnerabilityWindowsDetailsFixingKbsMap flattens the contents of NoteVulnerabilityWindowsDetailsFixingKbs from a JSON // response object. func flattenNoteVulnerabilityWindowsDetailsFixingKbsMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityWindowsDetailsFixingKbs { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityWindowsDetailsFixingKbs{} } if len(a) == 0 { return map[string]NoteVulnerabilityWindowsDetailsFixingKbs{} } items := make(map[string]NoteVulnerabilityWindowsDetailsFixingKbs) for k, item := range a { items[k] = *flattenNoteVulnerabilityWindowsDetailsFixingKbs(c, item.(map[string]interface{}), res) } return items } // flattenNoteVulnerabilityWindowsDetailsFixingKbsSlice flattens the contents of NoteVulnerabilityWindowsDetailsFixingKbs from a JSON // response object. func flattenNoteVulnerabilityWindowsDetailsFixingKbsSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityWindowsDetailsFixingKbs { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityWindowsDetailsFixingKbs{} } if len(a) == 0 { return []NoteVulnerabilityWindowsDetailsFixingKbs{} } items := make([]NoteVulnerabilityWindowsDetailsFixingKbs, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityWindowsDetailsFixingKbs(c, item.(map[string]interface{}), res)) } return items } // expandNoteVulnerabilityWindowsDetailsFixingKbs expands an instance of NoteVulnerabilityWindowsDetailsFixingKbs into a JSON // request object. func expandNoteVulnerabilityWindowsDetailsFixingKbs(c *Client, f *NoteVulnerabilityWindowsDetailsFixingKbs, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Url; !dcl.IsEmptyValueIndirect(v) { m["url"] = v } return m, nil } // flattenNoteVulnerabilityWindowsDetailsFixingKbs flattens an instance of NoteVulnerabilityWindowsDetailsFixingKbs from a JSON // response object. func flattenNoteVulnerabilityWindowsDetailsFixingKbs(c *Client, i interface{}, res *Note) *NoteVulnerabilityWindowsDetailsFixingKbs { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteVulnerabilityWindowsDetailsFixingKbs{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteVulnerabilityWindowsDetailsFixingKbs } r.Name = dcl.FlattenString(m["name"]) r.Url = dcl.FlattenString(m["url"]) return r } // expandNoteBuildMap expands the contents of NoteBuild into a JSON // request object. func expandNoteBuildMap(c *Client, f map[string]NoteBuild, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteBuild(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteBuildSlice expands the contents of NoteBuild into a JSON // request object. func expandNoteBuildSlice(c *Client, f []NoteBuild, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteBuild(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteBuildMap flattens the contents of NoteBuild from a JSON // response object. func flattenNoteBuildMap(c *Client, i interface{}, res *Note) map[string]NoteBuild { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteBuild{} } if len(a) == 0 { return map[string]NoteBuild{} } items := make(map[string]NoteBuild) for k, item := range a { items[k] = *flattenNoteBuild(c, item.(map[string]interface{}), res) } return items } // flattenNoteBuildSlice flattens the contents of NoteBuild from a JSON // response object. func flattenNoteBuildSlice(c *Client, i interface{}, res *Note) []NoteBuild { a, ok := i.([]interface{}) if !ok { return []NoteBuild{} } if len(a) == 0 { return []NoteBuild{} } items := make([]NoteBuild, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteBuild(c, item.(map[string]interface{}), res)) } return items } // expandNoteBuild expands an instance of NoteBuild into a JSON // request object. func expandNoteBuild(c *Client, f *NoteBuild, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.BuilderVersion; !dcl.IsEmptyValueIndirect(v) { m["builderVersion"] = v } if v, err := expandNoteBuildSignature(c, f.Signature, res); err != nil { return nil, fmt.Errorf("error expanding Signature into signature: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["signature"] = v } return m, nil } // flattenNoteBuild flattens an instance of NoteBuild from a JSON // response object. func flattenNoteBuild(c *Client, i interface{}, res *Note) *NoteBuild { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteBuild{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteBuild } r.BuilderVersion = dcl.FlattenString(m["builderVersion"]) r.Signature = flattenNoteBuildSignature(c, m["signature"], res) return r } // expandNoteBuildSignatureMap expands the contents of NoteBuildSignature into a JSON // request object. func expandNoteBuildSignatureMap(c *Client, f map[string]NoteBuildSignature, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteBuildSignature(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteBuildSignatureSlice expands the contents of NoteBuildSignature into a JSON // request object. func expandNoteBuildSignatureSlice(c *Client, f []NoteBuildSignature, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteBuildSignature(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteBuildSignatureMap flattens the contents of NoteBuildSignature from a JSON // response object. func flattenNoteBuildSignatureMap(c *Client, i interface{}, res *Note) map[string]NoteBuildSignature { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteBuildSignature{} } if len(a) == 0 { return map[string]NoteBuildSignature{} } items := make(map[string]NoteBuildSignature) for k, item := range a { items[k] = *flattenNoteBuildSignature(c, item.(map[string]interface{}), res) } return items } // flattenNoteBuildSignatureSlice flattens the contents of NoteBuildSignature from a JSON // response object. func flattenNoteBuildSignatureSlice(c *Client, i interface{}, res *Note) []NoteBuildSignature { a, ok := i.([]interface{}) if !ok { return []NoteBuildSignature{} } if len(a) == 0 { return []NoteBuildSignature{} } items := make([]NoteBuildSignature, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteBuildSignature(c, item.(map[string]interface{}), res)) } return items } // expandNoteBuildSignature expands an instance of NoteBuildSignature into a JSON // request object. func expandNoteBuildSignature(c *Client, f *NoteBuildSignature, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.PublicKey; !dcl.IsEmptyValueIndirect(v) { m["publicKey"] = v } if v := f.Signature; !dcl.IsEmptyValueIndirect(v) { m["signature"] = v } if v := f.KeyId; !dcl.IsEmptyValueIndirect(v) { m["keyId"] = v } if v := f.KeyType; !dcl.IsEmptyValueIndirect(v) { m["keyType"] = v } return m, nil } // flattenNoteBuildSignature flattens an instance of NoteBuildSignature from a JSON // response object. func flattenNoteBuildSignature(c *Client, i interface{}, res *Note) *NoteBuildSignature { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteBuildSignature{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteBuildSignature } r.PublicKey = dcl.FlattenString(m["publicKey"]) r.Signature = dcl.FlattenString(m["signature"]) r.KeyId = dcl.FlattenString(m["keyId"]) r.KeyType = flattenNoteBuildSignatureKeyTypeEnum(m["keyType"]) return r } // expandNoteImageMap expands the contents of NoteImage into a JSON // request object. func expandNoteImageMap(c *Client, f map[string]NoteImage, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteImage(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteImageSlice expands the contents of NoteImage into a JSON // request object. func expandNoteImageSlice(c *Client, f []NoteImage, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteImage(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteImageMap flattens the contents of NoteImage from a JSON // response object. func flattenNoteImageMap(c *Client, i interface{}, res *Note) map[string]NoteImage { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteImage{} } if len(a) == 0 { return map[string]NoteImage{} } items := make(map[string]NoteImage) for k, item := range a { items[k] = *flattenNoteImage(c, item.(map[string]interface{}), res) } return items } // flattenNoteImageSlice flattens the contents of NoteImage from a JSON // response object. func flattenNoteImageSlice(c *Client, i interface{}, res *Note) []NoteImage { a, ok := i.([]interface{}) if !ok { return []NoteImage{} } if len(a) == 0 { return []NoteImage{} } items := make([]NoteImage, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteImage(c, item.(map[string]interface{}), res)) } return items } // expandNoteImage expands an instance of NoteImage into a JSON // request object. func expandNoteImage(c *Client, f *NoteImage, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.ResourceUrl; !dcl.IsEmptyValueIndirect(v) { m["resourceUrl"] = v } if v, err := expandNoteImageFingerprint(c, f.Fingerprint, res); err != nil { return nil, fmt.Errorf("error expanding Fingerprint into fingerprint: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["fingerprint"] = v } return m, nil } // flattenNoteImage flattens an instance of NoteImage from a JSON // response object. func flattenNoteImage(c *Client, i interface{}, res *Note) *NoteImage { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteImage{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteImage } r.ResourceUrl = dcl.FlattenString(m["resourceUrl"]) r.Fingerprint = flattenNoteImageFingerprint(c, m["fingerprint"], res) return r } // expandNoteImageFingerprintMap expands the contents of NoteImageFingerprint into a JSON // request object. func expandNoteImageFingerprintMap(c *Client, f map[string]NoteImageFingerprint, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteImageFingerprint(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteImageFingerprintSlice expands the contents of NoteImageFingerprint into a JSON // request object. func expandNoteImageFingerprintSlice(c *Client, f []NoteImageFingerprint, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteImageFingerprint(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteImageFingerprintMap flattens the contents of NoteImageFingerprint from a JSON // response object. func flattenNoteImageFingerprintMap(c *Client, i interface{}, res *Note) map[string]NoteImageFingerprint { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteImageFingerprint{} } if len(a) == 0 { return map[string]NoteImageFingerprint{} } items := make(map[string]NoteImageFingerprint) for k, item := range a { items[k] = *flattenNoteImageFingerprint(c, item.(map[string]interface{}), res) } return items } // flattenNoteImageFingerprintSlice flattens the contents of NoteImageFingerprint from a JSON // response object. func flattenNoteImageFingerprintSlice(c *Client, i interface{}, res *Note) []NoteImageFingerprint { a, ok := i.([]interface{}) if !ok { return []NoteImageFingerprint{} } if len(a) == 0 { return []NoteImageFingerprint{} } items := make([]NoteImageFingerprint, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteImageFingerprint(c, item.(map[string]interface{}), res)) } return items } // expandNoteImageFingerprint expands an instance of NoteImageFingerprint into a JSON // request object. func expandNoteImageFingerprint(c *Client, f *NoteImageFingerprint, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.V1Name; !dcl.IsEmptyValueIndirect(v) { m["v1Name"] = v } if v := f.V2Blob; v != nil { m["v2Blob"] = v } return m, nil } // flattenNoteImageFingerprint flattens an instance of NoteImageFingerprint from a JSON // response object. func flattenNoteImageFingerprint(c *Client, i interface{}, res *Note) *NoteImageFingerprint { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteImageFingerprint{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteImageFingerprint } r.V1Name = dcl.FlattenString(m["v1Name"]) r.V2Blob = dcl.FlattenStringSlice(m["v2Blob"]) r.V2Name = dcl.FlattenString(m["v2Name"]) return r } // expandNotePackageMap expands the contents of NotePackage into a JSON // request object. func expandNotePackageMap(c *Client, f map[string]NotePackage, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNotePackage(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNotePackageSlice expands the contents of NotePackage into a JSON // request object. func expandNotePackageSlice(c *Client, f []NotePackage, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNotePackage(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNotePackageMap flattens the contents of NotePackage from a JSON // response object. func flattenNotePackageMap(c *Client, i interface{}, res *Note) map[string]NotePackage { a, ok := i.(map[string]interface{}) if !ok { return map[string]NotePackage{} } if len(a) == 0 { return map[string]NotePackage{} } items := make(map[string]NotePackage) for k, item := range a { items[k] = *flattenNotePackage(c, item.(map[string]interface{}), res) } return items } // flattenNotePackageSlice flattens the contents of NotePackage from a JSON // response object. func flattenNotePackageSlice(c *Client, i interface{}, res *Note) []NotePackage { a, ok := i.([]interface{}) if !ok { return []NotePackage{} } if len(a) == 0 { return []NotePackage{} } items := make([]NotePackage, 0, len(a)) for _, item := range a { items = append(items, *flattenNotePackage(c, item.(map[string]interface{}), res)) } return items } // expandNotePackage expands an instance of NotePackage into a JSON // request object. func expandNotePackage(c *Client, f *NotePackage, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v, err := expandNotePackageDistributionSlice(c, f.Distribution, res); err != nil { return nil, fmt.Errorf("error expanding Distribution into distribution: %w", err) } else if v != nil { m["distribution"] = v } return m, nil } // flattenNotePackage flattens an instance of NotePackage from a JSON // response object. func flattenNotePackage(c *Client, i interface{}, res *Note) *NotePackage { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NotePackage{} if dcl.IsEmptyValueIndirect(i) { return EmptyNotePackage } r.Name = dcl.FlattenString(m["name"]) r.Distribution = flattenNotePackageDistributionSlice(c, m["distribution"], res) return r } // expandNotePackageDistributionMap expands the contents of NotePackageDistribution into a JSON // request object. func expandNotePackageDistributionMap(c *Client, f map[string]NotePackageDistribution, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNotePackageDistribution(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNotePackageDistributionSlice expands the contents of NotePackageDistribution into a JSON // request object. func expandNotePackageDistributionSlice(c *Client, f []NotePackageDistribution, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNotePackageDistribution(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNotePackageDistributionMap flattens the contents of NotePackageDistribution from a JSON // response object. func flattenNotePackageDistributionMap(c *Client, i interface{}, res *Note) map[string]NotePackageDistribution { a, ok := i.(map[string]interface{}) if !ok { return map[string]NotePackageDistribution{} } if len(a) == 0 { return map[string]NotePackageDistribution{} } items := make(map[string]NotePackageDistribution) for k, item := range a { items[k] = *flattenNotePackageDistribution(c, item.(map[string]interface{}), res) } return items } // flattenNotePackageDistributionSlice flattens the contents of NotePackageDistribution from a JSON // response object. func flattenNotePackageDistributionSlice(c *Client, i interface{}, res *Note) []NotePackageDistribution { a, ok := i.([]interface{}) if !ok { return []NotePackageDistribution{} } if len(a) == 0 { return []NotePackageDistribution{} } items := make([]NotePackageDistribution, 0, len(a)) for _, item := range a { items = append(items, *flattenNotePackageDistribution(c, item.(map[string]interface{}), res)) } return items } // expandNotePackageDistribution expands an instance of NotePackageDistribution into a JSON // request object. func expandNotePackageDistribution(c *Client, f *NotePackageDistribution, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } m := make(map[string]interface{}) if v := f.CpeUri; !dcl.IsEmptyValueIndirect(v) { m["cpeUri"] = v } if v := f.Architecture; !dcl.IsEmptyValueIndirect(v) { m["architecture"] = v } if v, err := expandNotePackageDistributionLatestVersion(c, f.LatestVersion, res); err != nil { return nil, fmt.Errorf("error expanding LatestVersion into latestVersion: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["latestVersion"] = v } if v := f.Maintainer; !dcl.IsEmptyValueIndirect(v) { m["maintainer"] = v } if v := f.Url; !dcl.IsEmptyValueIndirect(v) { m["url"] = v } if v := f.Description; !dcl.IsEmptyValueIndirect(v) { m["description"] = v } return m, nil } // flattenNotePackageDistribution flattens an instance of NotePackageDistribution from a JSON // response object. func flattenNotePackageDistribution(c *Client, i interface{}, res *Note) *NotePackageDistribution { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NotePackageDistribution{} if dcl.IsEmptyValueIndirect(i) { return EmptyNotePackageDistribution } r.CpeUri = dcl.FlattenString(m["cpeUri"]) r.Architecture = flattenNotePackageDistributionArchitectureEnum(m["architecture"]) r.LatestVersion = flattenNotePackageDistributionLatestVersion(c, m["latestVersion"], res) r.Maintainer = dcl.FlattenString(m["maintainer"]) r.Url = dcl.FlattenString(m["url"]) r.Description = dcl.FlattenString(m["description"]) return r } // expandNotePackageDistributionLatestVersionMap expands the contents of NotePackageDistributionLatestVersion into a JSON // request object. func expandNotePackageDistributionLatestVersionMap(c *Client, f map[string]NotePackageDistributionLatestVersion, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNotePackageDistributionLatestVersion(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNotePackageDistributionLatestVersionSlice expands the contents of NotePackageDistributionLatestVersion into a JSON // request object. func expandNotePackageDistributionLatestVersionSlice(c *Client, f []NotePackageDistributionLatestVersion, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNotePackageDistributionLatestVersion(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNotePackageDistributionLatestVersionMap flattens the contents of NotePackageDistributionLatestVersion from a JSON // response object. func flattenNotePackageDistributionLatestVersionMap(c *Client, i interface{}, res *Note) map[string]NotePackageDistributionLatestVersion { a, ok := i.(map[string]interface{}) if !ok { return map[string]NotePackageDistributionLatestVersion{} } if len(a) == 0 { return map[string]NotePackageDistributionLatestVersion{} } items := make(map[string]NotePackageDistributionLatestVersion) for k, item := range a { items[k] = *flattenNotePackageDistributionLatestVersion(c, item.(map[string]interface{}), res) } return items } // flattenNotePackageDistributionLatestVersionSlice flattens the contents of NotePackageDistributionLatestVersion from a JSON // response object. func flattenNotePackageDistributionLatestVersionSlice(c *Client, i interface{}, res *Note) []NotePackageDistributionLatestVersion { a, ok := i.([]interface{}) if !ok { return []NotePackageDistributionLatestVersion{} } if len(a) == 0 { return []NotePackageDistributionLatestVersion{} } items := make([]NotePackageDistributionLatestVersion, 0, len(a)) for _, item := range a { items = append(items, *flattenNotePackageDistributionLatestVersion(c, item.(map[string]interface{}), res)) } return items } // expandNotePackageDistributionLatestVersion expands an instance of NotePackageDistributionLatestVersion into a JSON // request object. func expandNotePackageDistributionLatestVersion(c *Client, f *NotePackageDistributionLatestVersion, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.Epoch; !dcl.IsEmptyValueIndirect(v) { m["epoch"] = v } if v := f.Name; !dcl.IsEmptyValueIndirect(v) { m["name"] = v } if v := f.Revision; !dcl.IsEmptyValueIndirect(v) { m["revision"] = v } if v := f.Kind; !dcl.IsEmptyValueIndirect(v) { m["kind"] = v } if v := f.FullName; !dcl.IsEmptyValueIndirect(v) { m["fullName"] = v } return m, nil } // flattenNotePackageDistributionLatestVersion flattens an instance of NotePackageDistributionLatestVersion from a JSON // response object. func flattenNotePackageDistributionLatestVersion(c *Client, i interface{}, res *Note) *NotePackageDistributionLatestVersion { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NotePackageDistributionLatestVersion{} if dcl.IsEmptyValueIndirect(i) { return EmptyNotePackageDistributionLatestVersion } r.Epoch = dcl.FlattenInteger(m["epoch"]) r.Name = dcl.FlattenString(m["name"]) r.Revision = dcl.FlattenString(m["revision"]) r.Kind = flattenNotePackageDistributionLatestVersionKindEnum(m["kind"]) r.FullName = dcl.FlattenString(m["fullName"]) return r } // expandNoteDiscoveryMap expands the contents of NoteDiscovery into a JSON // request object. func expandNoteDiscoveryMap(c *Client, f map[string]NoteDiscovery, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteDiscovery(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteDiscoverySlice expands the contents of NoteDiscovery into a JSON // request object. func expandNoteDiscoverySlice(c *Client, f []NoteDiscovery, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteDiscovery(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteDiscoveryMap flattens the contents of NoteDiscovery from a JSON // response object. func flattenNoteDiscoveryMap(c *Client, i interface{}, res *Note) map[string]NoteDiscovery { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteDiscovery{} } if len(a) == 0 { return map[string]NoteDiscovery{} } items := make(map[string]NoteDiscovery) for k, item := range a { items[k] = *flattenNoteDiscovery(c, item.(map[string]interface{}), res) } return items } // flattenNoteDiscoverySlice flattens the contents of NoteDiscovery from a JSON // response object. func flattenNoteDiscoverySlice(c *Client, i interface{}, res *Note) []NoteDiscovery { a, ok := i.([]interface{}) if !ok { return []NoteDiscovery{} } if len(a) == 0 { return []NoteDiscovery{} } items := make([]NoteDiscovery, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteDiscovery(c, item.(map[string]interface{}), res)) } return items } // expandNoteDiscovery expands an instance of NoteDiscovery into a JSON // request object. func expandNoteDiscovery(c *Client, f *NoteDiscovery, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.AnalysisKind; !dcl.IsEmptyValueIndirect(v) { m["analysisKind"] = v } return m, nil } // flattenNoteDiscovery flattens an instance of NoteDiscovery from a JSON // response object. func flattenNoteDiscovery(c *Client, i interface{}, res *Note) *NoteDiscovery { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteDiscovery{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteDiscovery } r.AnalysisKind = flattenNoteDiscoveryAnalysisKindEnum(m["analysisKind"]) return r } // expandNoteDeploymentMap expands the contents of NoteDeployment into a JSON // request object. func expandNoteDeploymentMap(c *Client, f map[string]NoteDeployment, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteDeployment(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteDeploymentSlice expands the contents of NoteDeployment into a JSON // request object. func expandNoteDeploymentSlice(c *Client, f []NoteDeployment, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteDeployment(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteDeploymentMap flattens the contents of NoteDeployment from a JSON // response object. func flattenNoteDeploymentMap(c *Client, i interface{}, res *Note) map[string]NoteDeployment { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteDeployment{} } if len(a) == 0 { return map[string]NoteDeployment{} } items := make(map[string]NoteDeployment) for k, item := range a { items[k] = *flattenNoteDeployment(c, item.(map[string]interface{}), res) } return items } // flattenNoteDeploymentSlice flattens the contents of NoteDeployment from a JSON // response object. func flattenNoteDeploymentSlice(c *Client, i interface{}, res *Note) []NoteDeployment { a, ok := i.([]interface{}) if !ok { return []NoteDeployment{} } if len(a) == 0 { return []NoteDeployment{} } items := make([]NoteDeployment, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteDeployment(c, item.(map[string]interface{}), res)) } return items } // expandNoteDeployment expands an instance of NoteDeployment into a JSON // request object. func expandNoteDeployment(c *Client, f *NoteDeployment, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.ResourceUri; v != nil { m["resourceUri"] = v } return m, nil } // flattenNoteDeployment flattens an instance of NoteDeployment from a JSON // response object. func flattenNoteDeployment(c *Client, i interface{}, res *Note) *NoteDeployment { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteDeployment{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteDeployment } r.ResourceUri = dcl.FlattenStringSlice(m["resourceUri"]) return r } // expandNoteAttestationMap expands the contents of NoteAttestation into a JSON // request object. func expandNoteAttestationMap(c *Client, f map[string]NoteAttestation, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteAttestation(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteAttestationSlice expands the contents of NoteAttestation into a JSON // request object. func expandNoteAttestationSlice(c *Client, f []NoteAttestation, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteAttestation(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteAttestationMap flattens the contents of NoteAttestation from a JSON // response object. func flattenNoteAttestationMap(c *Client, i interface{}, res *Note) map[string]NoteAttestation { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteAttestation{} } if len(a) == 0 { return map[string]NoteAttestation{} } items := make(map[string]NoteAttestation) for k, item := range a { items[k] = *flattenNoteAttestation(c, item.(map[string]interface{}), res) } return items } // flattenNoteAttestationSlice flattens the contents of NoteAttestation from a JSON // response object. func flattenNoteAttestationSlice(c *Client, i interface{}, res *Note) []NoteAttestation { a, ok := i.([]interface{}) if !ok { return []NoteAttestation{} } if len(a) == 0 { return []NoteAttestation{} } items := make([]NoteAttestation, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteAttestation(c, item.(map[string]interface{}), res)) } return items } // expandNoteAttestation expands an instance of NoteAttestation into a JSON // request object. func expandNoteAttestation(c *Client, f *NoteAttestation, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v, err := expandNoteAttestationHint(c, f.Hint, res); err != nil { return nil, fmt.Errorf("error expanding Hint into hint: %w", err) } else if !dcl.IsEmptyValueIndirect(v) { m["hint"] = v } return m, nil } // flattenNoteAttestation flattens an instance of NoteAttestation from a JSON // response object. func flattenNoteAttestation(c *Client, i interface{}, res *Note) *NoteAttestation { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteAttestation{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteAttestation } r.Hint = flattenNoteAttestationHint(c, m["hint"], res) return r } // expandNoteAttestationHintMap expands the contents of NoteAttestationHint into a JSON // request object. func expandNoteAttestationHintMap(c *Client, f map[string]NoteAttestationHint, res *Note) (map[string]interface{}, error) { if f == nil { return nil, nil } items := make(map[string]interface{}) for k, item := range f { i, err := expandNoteAttestationHint(c, &item, res) if err != nil { return nil, err } if i != nil { items[k] = i } } return items, nil } // expandNoteAttestationHintSlice expands the contents of NoteAttestationHint into a JSON // request object. func expandNoteAttestationHintSlice(c *Client, f []NoteAttestationHint, res *Note) ([]map[string]interface{}, error) { if f == nil { return nil, nil } items := []map[string]interface{}{} for _, item := range f { i, err := expandNoteAttestationHint(c, &item, res) if err != nil { return nil, err } items = append(items, i) } return items, nil } // flattenNoteAttestationHintMap flattens the contents of NoteAttestationHint from a JSON // response object. func flattenNoteAttestationHintMap(c *Client, i interface{}, res *Note) map[string]NoteAttestationHint { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteAttestationHint{} } if len(a) == 0 { return map[string]NoteAttestationHint{} } items := make(map[string]NoteAttestationHint) for k, item := range a { items[k] = *flattenNoteAttestationHint(c, item.(map[string]interface{}), res) } return items } // flattenNoteAttestationHintSlice flattens the contents of NoteAttestationHint from a JSON // response object. func flattenNoteAttestationHintSlice(c *Client, i interface{}, res *Note) []NoteAttestationHint { a, ok := i.([]interface{}) if !ok { return []NoteAttestationHint{} } if len(a) == 0 { return []NoteAttestationHint{} } items := make([]NoteAttestationHint, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteAttestationHint(c, item.(map[string]interface{}), res)) } return items } // expandNoteAttestationHint expands an instance of NoteAttestationHint into a JSON // request object. func expandNoteAttestationHint(c *Client, f *NoteAttestationHint, res *Note) (map[string]interface{}, error) { if dcl.IsEmptyValueIndirect(f) { return nil, nil } m := make(map[string]interface{}) if v := f.HumanReadableName; !dcl.IsEmptyValueIndirect(v) { m["humanReadableName"] = v } return m, nil } // flattenNoteAttestationHint flattens an instance of NoteAttestationHint from a JSON // response object. func flattenNoteAttestationHint(c *Client, i interface{}, res *Note) *NoteAttestationHint { m, ok := i.(map[string]interface{}) if !ok { return nil } r := &NoteAttestationHint{} if dcl.IsEmptyValueIndirect(i) { return EmptyNoteAttestationHint } r.HumanReadableName = dcl.FlattenString(m["humanReadableName"]) return r } // flattenNoteVulnerabilitySeverityEnumMap flattens the contents of NoteVulnerabilitySeverityEnum from a JSON // response object. func flattenNoteVulnerabilitySeverityEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilitySeverityEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilitySeverityEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilitySeverityEnum{} } items := make(map[string]NoteVulnerabilitySeverityEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilitySeverityEnum(item.(interface{})) } return items } // flattenNoteVulnerabilitySeverityEnumSlice flattens the contents of NoteVulnerabilitySeverityEnum from a JSON // response object. func flattenNoteVulnerabilitySeverityEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilitySeverityEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilitySeverityEnum{} } if len(a) == 0 { return []NoteVulnerabilitySeverityEnum{} } items := make([]NoteVulnerabilitySeverityEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilitySeverityEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilitySeverityEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilitySeverityEnum with the same value as that string. func flattenNoteVulnerabilitySeverityEnum(i interface{}) *NoteVulnerabilitySeverityEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilitySeverityEnumRef(s) } // flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnumMap flattens the contents of NoteVulnerabilityDetailsAffectedVersionStartKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsAffectedVersionStartKindEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsAffectedVersionStartKindEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsAffectedVersionStartKindEnum{} } items := make(map[string]NoteVulnerabilityDetailsAffectedVersionStartKindEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnumSlice flattens the contents of NoteVulnerabilityDetailsAffectedVersionStartKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsAffectedVersionStartKindEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsAffectedVersionStartKindEnum{} } if len(a) == 0 { return []NoteVulnerabilityDetailsAffectedVersionStartKindEnum{} } items := make([]NoteVulnerabilityDetailsAffectedVersionStartKindEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityDetailsAffectedVersionStartKindEnum with the same value as that string. func flattenNoteVulnerabilityDetailsAffectedVersionStartKindEnum(i interface{}) *NoteVulnerabilityDetailsAffectedVersionStartKindEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityDetailsAffectedVersionStartKindEnumRef(s) } // flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnumMap flattens the contents of NoteVulnerabilityDetailsAffectedVersionEndKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsAffectedVersionEndKindEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsAffectedVersionEndKindEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsAffectedVersionEndKindEnum{} } items := make(map[string]NoteVulnerabilityDetailsAffectedVersionEndKindEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnumSlice flattens the contents of NoteVulnerabilityDetailsAffectedVersionEndKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsAffectedVersionEndKindEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsAffectedVersionEndKindEnum{} } if len(a) == 0 { return []NoteVulnerabilityDetailsAffectedVersionEndKindEnum{} } items := make([]NoteVulnerabilityDetailsAffectedVersionEndKindEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityDetailsAffectedVersionEndKindEnum with the same value as that string. func flattenNoteVulnerabilityDetailsAffectedVersionEndKindEnum(i interface{}) *NoteVulnerabilityDetailsAffectedVersionEndKindEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityDetailsAffectedVersionEndKindEnumRef(s) } // flattenNoteVulnerabilityDetailsFixedVersionKindEnumMap flattens the contents of NoteVulnerabilityDetailsFixedVersionKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsFixedVersionKindEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityDetailsFixedVersionKindEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityDetailsFixedVersionKindEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityDetailsFixedVersionKindEnum{} } items := make(map[string]NoteVulnerabilityDetailsFixedVersionKindEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityDetailsFixedVersionKindEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityDetailsFixedVersionKindEnumSlice flattens the contents of NoteVulnerabilityDetailsFixedVersionKindEnum from a JSON // response object. func flattenNoteVulnerabilityDetailsFixedVersionKindEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityDetailsFixedVersionKindEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityDetailsFixedVersionKindEnum{} } if len(a) == 0 { return []NoteVulnerabilityDetailsFixedVersionKindEnum{} } items := make([]NoteVulnerabilityDetailsFixedVersionKindEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityDetailsFixedVersionKindEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityDetailsFixedVersionKindEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityDetailsFixedVersionKindEnum with the same value as that string. func flattenNoteVulnerabilityDetailsFixedVersionKindEnum(i interface{}) *NoteVulnerabilityDetailsFixedVersionKindEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityDetailsFixedVersionKindEnumRef(s) } // flattenNoteVulnerabilityCvssV3AttackVectorEnumMap flattens the contents of NoteVulnerabilityCvssV3AttackVectorEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AttackVectorEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3AttackVectorEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3AttackVectorEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3AttackVectorEnum{} } items := make(map[string]NoteVulnerabilityCvssV3AttackVectorEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3AttackVectorEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3AttackVectorEnumSlice flattens the contents of NoteVulnerabilityCvssV3AttackVectorEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AttackVectorEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3AttackVectorEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3AttackVectorEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3AttackVectorEnum{} } items := make([]NoteVulnerabilityCvssV3AttackVectorEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3AttackVectorEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3AttackVectorEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3AttackVectorEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3AttackVectorEnum(i interface{}) *NoteVulnerabilityCvssV3AttackVectorEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3AttackVectorEnumRef(s) } // flattenNoteVulnerabilityCvssV3AttackComplexityEnumMap flattens the contents of NoteVulnerabilityCvssV3AttackComplexityEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AttackComplexityEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3AttackComplexityEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3AttackComplexityEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3AttackComplexityEnum{} } items := make(map[string]NoteVulnerabilityCvssV3AttackComplexityEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3AttackComplexityEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3AttackComplexityEnumSlice flattens the contents of NoteVulnerabilityCvssV3AttackComplexityEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AttackComplexityEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3AttackComplexityEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3AttackComplexityEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3AttackComplexityEnum{} } items := make([]NoteVulnerabilityCvssV3AttackComplexityEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3AttackComplexityEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3AttackComplexityEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3AttackComplexityEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3AttackComplexityEnum(i interface{}) *NoteVulnerabilityCvssV3AttackComplexityEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3AttackComplexityEnumRef(s) } // flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnumMap flattens the contents of NoteVulnerabilityCvssV3PrivilegesRequiredEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3PrivilegesRequiredEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3PrivilegesRequiredEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3PrivilegesRequiredEnum{} } items := make(map[string]NoteVulnerabilityCvssV3PrivilegesRequiredEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnumSlice flattens the contents of NoteVulnerabilityCvssV3PrivilegesRequiredEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3PrivilegesRequiredEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3PrivilegesRequiredEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3PrivilegesRequiredEnum{} } items := make([]NoteVulnerabilityCvssV3PrivilegesRequiredEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3PrivilegesRequiredEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3PrivilegesRequiredEnum(i interface{}) *NoteVulnerabilityCvssV3PrivilegesRequiredEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3PrivilegesRequiredEnumRef(s) } // flattenNoteVulnerabilityCvssV3UserInteractionEnumMap flattens the contents of NoteVulnerabilityCvssV3UserInteractionEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3UserInteractionEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3UserInteractionEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3UserInteractionEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3UserInteractionEnum{} } items := make(map[string]NoteVulnerabilityCvssV3UserInteractionEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3UserInteractionEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3UserInteractionEnumSlice flattens the contents of NoteVulnerabilityCvssV3UserInteractionEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3UserInteractionEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3UserInteractionEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3UserInteractionEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3UserInteractionEnum{} } items := make([]NoteVulnerabilityCvssV3UserInteractionEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3UserInteractionEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3UserInteractionEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3UserInteractionEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3UserInteractionEnum(i interface{}) *NoteVulnerabilityCvssV3UserInteractionEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3UserInteractionEnumRef(s) } // flattenNoteVulnerabilityCvssV3ScopeEnumMap flattens the contents of NoteVulnerabilityCvssV3ScopeEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3ScopeEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3ScopeEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3ScopeEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3ScopeEnum{} } items := make(map[string]NoteVulnerabilityCvssV3ScopeEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3ScopeEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3ScopeEnumSlice flattens the contents of NoteVulnerabilityCvssV3ScopeEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3ScopeEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3ScopeEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3ScopeEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3ScopeEnum{} } items := make([]NoteVulnerabilityCvssV3ScopeEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3ScopeEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3ScopeEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3ScopeEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3ScopeEnum(i interface{}) *NoteVulnerabilityCvssV3ScopeEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3ScopeEnumRef(s) } // flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnumMap flattens the contents of NoteVulnerabilityCvssV3ConfidentialityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3ConfidentialityImpactEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3ConfidentialityImpactEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3ConfidentialityImpactEnum{} } items := make(map[string]NoteVulnerabilityCvssV3ConfidentialityImpactEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnumSlice flattens the contents of NoteVulnerabilityCvssV3ConfidentialityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3ConfidentialityImpactEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3ConfidentialityImpactEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3ConfidentialityImpactEnum{} } items := make([]NoteVulnerabilityCvssV3ConfidentialityImpactEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3ConfidentialityImpactEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3ConfidentialityImpactEnum(i interface{}) *NoteVulnerabilityCvssV3ConfidentialityImpactEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3ConfidentialityImpactEnumRef(s) } // flattenNoteVulnerabilityCvssV3IntegrityImpactEnumMap flattens the contents of NoteVulnerabilityCvssV3IntegrityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3IntegrityImpactEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3IntegrityImpactEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3IntegrityImpactEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3IntegrityImpactEnum{} } items := make(map[string]NoteVulnerabilityCvssV3IntegrityImpactEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3IntegrityImpactEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3IntegrityImpactEnumSlice flattens the contents of NoteVulnerabilityCvssV3IntegrityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3IntegrityImpactEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3IntegrityImpactEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3IntegrityImpactEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3IntegrityImpactEnum{} } items := make([]NoteVulnerabilityCvssV3IntegrityImpactEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3IntegrityImpactEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3IntegrityImpactEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3IntegrityImpactEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3IntegrityImpactEnum(i interface{}) *NoteVulnerabilityCvssV3IntegrityImpactEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3IntegrityImpactEnumRef(s) } // flattenNoteVulnerabilityCvssV3AvailabilityImpactEnumMap flattens the contents of NoteVulnerabilityCvssV3AvailabilityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AvailabilityImpactEnumMap(c *Client, i interface{}, res *Note) map[string]NoteVulnerabilityCvssV3AvailabilityImpactEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteVulnerabilityCvssV3AvailabilityImpactEnum{} } if len(a) == 0 { return map[string]NoteVulnerabilityCvssV3AvailabilityImpactEnum{} } items := make(map[string]NoteVulnerabilityCvssV3AvailabilityImpactEnum) for k, item := range a { items[k] = *flattenNoteVulnerabilityCvssV3AvailabilityImpactEnum(item.(interface{})) } return items } // flattenNoteVulnerabilityCvssV3AvailabilityImpactEnumSlice flattens the contents of NoteVulnerabilityCvssV3AvailabilityImpactEnum from a JSON // response object. func flattenNoteVulnerabilityCvssV3AvailabilityImpactEnumSlice(c *Client, i interface{}, res *Note) []NoteVulnerabilityCvssV3AvailabilityImpactEnum { a, ok := i.([]interface{}) if !ok { return []NoteVulnerabilityCvssV3AvailabilityImpactEnum{} } if len(a) == 0 { return []NoteVulnerabilityCvssV3AvailabilityImpactEnum{} } items := make([]NoteVulnerabilityCvssV3AvailabilityImpactEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteVulnerabilityCvssV3AvailabilityImpactEnum(item.(interface{}))) } return items } // flattenNoteVulnerabilityCvssV3AvailabilityImpactEnum asserts that an interface is a string, and returns a // pointer to a *NoteVulnerabilityCvssV3AvailabilityImpactEnum with the same value as that string. func flattenNoteVulnerabilityCvssV3AvailabilityImpactEnum(i interface{}) *NoteVulnerabilityCvssV3AvailabilityImpactEnum { s, ok := i.(string) if !ok { return nil } return NoteVulnerabilityCvssV3AvailabilityImpactEnumRef(s) } // flattenNoteBuildSignatureKeyTypeEnumMap flattens the contents of NoteBuildSignatureKeyTypeEnum from a JSON // response object. func flattenNoteBuildSignatureKeyTypeEnumMap(c *Client, i interface{}, res *Note) map[string]NoteBuildSignatureKeyTypeEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteBuildSignatureKeyTypeEnum{} } if len(a) == 0 { return map[string]NoteBuildSignatureKeyTypeEnum{} } items := make(map[string]NoteBuildSignatureKeyTypeEnum) for k, item := range a { items[k] = *flattenNoteBuildSignatureKeyTypeEnum(item.(interface{})) } return items } // flattenNoteBuildSignatureKeyTypeEnumSlice flattens the contents of NoteBuildSignatureKeyTypeEnum from a JSON // response object. func flattenNoteBuildSignatureKeyTypeEnumSlice(c *Client, i interface{}, res *Note) []NoteBuildSignatureKeyTypeEnum { a, ok := i.([]interface{}) if !ok { return []NoteBuildSignatureKeyTypeEnum{} } if len(a) == 0 { return []NoteBuildSignatureKeyTypeEnum{} } items := make([]NoteBuildSignatureKeyTypeEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteBuildSignatureKeyTypeEnum(item.(interface{}))) } return items } // flattenNoteBuildSignatureKeyTypeEnum asserts that an interface is a string, and returns a // pointer to a *NoteBuildSignatureKeyTypeEnum with the same value as that string. func flattenNoteBuildSignatureKeyTypeEnum(i interface{}) *NoteBuildSignatureKeyTypeEnum { s, ok := i.(string) if !ok { return nil } return NoteBuildSignatureKeyTypeEnumRef(s) } // flattenNotePackageDistributionArchitectureEnumMap flattens the contents of NotePackageDistributionArchitectureEnum from a JSON // response object. func flattenNotePackageDistributionArchitectureEnumMap(c *Client, i interface{}, res *Note) map[string]NotePackageDistributionArchitectureEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NotePackageDistributionArchitectureEnum{} } if len(a) == 0 { return map[string]NotePackageDistributionArchitectureEnum{} } items := make(map[string]NotePackageDistributionArchitectureEnum) for k, item := range a { items[k] = *flattenNotePackageDistributionArchitectureEnum(item.(interface{})) } return items } // flattenNotePackageDistributionArchitectureEnumSlice flattens the contents of NotePackageDistributionArchitectureEnum from a JSON // response object. func flattenNotePackageDistributionArchitectureEnumSlice(c *Client, i interface{}, res *Note) []NotePackageDistributionArchitectureEnum { a, ok := i.([]interface{}) if !ok { return []NotePackageDistributionArchitectureEnum{} } if len(a) == 0 { return []NotePackageDistributionArchitectureEnum{} } items := make([]NotePackageDistributionArchitectureEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNotePackageDistributionArchitectureEnum(item.(interface{}))) } return items } // flattenNotePackageDistributionArchitectureEnum asserts that an interface is a string, and returns a // pointer to a *NotePackageDistributionArchitectureEnum with the same value as that string. func flattenNotePackageDistributionArchitectureEnum(i interface{}) *NotePackageDistributionArchitectureEnum { s, ok := i.(string) if !ok { return nil } return NotePackageDistributionArchitectureEnumRef(s) } // flattenNotePackageDistributionLatestVersionKindEnumMap flattens the contents of NotePackageDistributionLatestVersionKindEnum from a JSON // response object. func flattenNotePackageDistributionLatestVersionKindEnumMap(c *Client, i interface{}, res *Note) map[string]NotePackageDistributionLatestVersionKindEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NotePackageDistributionLatestVersionKindEnum{} } if len(a) == 0 { return map[string]NotePackageDistributionLatestVersionKindEnum{} } items := make(map[string]NotePackageDistributionLatestVersionKindEnum) for k, item := range a { items[k] = *flattenNotePackageDistributionLatestVersionKindEnum(item.(interface{})) } return items } // flattenNotePackageDistributionLatestVersionKindEnumSlice flattens the contents of NotePackageDistributionLatestVersionKindEnum from a JSON // response object. func flattenNotePackageDistributionLatestVersionKindEnumSlice(c *Client, i interface{}, res *Note) []NotePackageDistributionLatestVersionKindEnum { a, ok := i.([]interface{}) if !ok { return []NotePackageDistributionLatestVersionKindEnum{} } if len(a) == 0 { return []NotePackageDistributionLatestVersionKindEnum{} } items := make([]NotePackageDistributionLatestVersionKindEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNotePackageDistributionLatestVersionKindEnum(item.(interface{}))) } return items } // flattenNotePackageDistributionLatestVersionKindEnum asserts that an interface is a string, and returns a // pointer to a *NotePackageDistributionLatestVersionKindEnum with the same value as that string. func flattenNotePackageDistributionLatestVersionKindEnum(i interface{}) *NotePackageDistributionLatestVersionKindEnum { s, ok := i.(string) if !ok { return nil } return NotePackageDistributionLatestVersionKindEnumRef(s) } // flattenNoteDiscoveryAnalysisKindEnumMap flattens the contents of NoteDiscoveryAnalysisKindEnum from a JSON // response object. func flattenNoteDiscoveryAnalysisKindEnumMap(c *Client, i interface{}, res *Note) map[string]NoteDiscoveryAnalysisKindEnum { a, ok := i.(map[string]interface{}) if !ok { return map[string]NoteDiscoveryAnalysisKindEnum{} } if len(a) == 0 { return map[string]NoteDiscoveryAnalysisKindEnum{} } items := make(map[string]NoteDiscoveryAnalysisKindEnum) for k, item := range a { items[k] = *flattenNoteDiscoveryAnalysisKindEnum(item.(interface{})) } return items } // flattenNoteDiscoveryAnalysisKindEnumSlice flattens the contents of NoteDiscoveryAnalysisKindEnum from a JSON // response object. func flattenNoteDiscoveryAnalysisKindEnumSlice(c *Client, i interface{}, res *Note) []NoteDiscoveryAnalysisKindEnum { a, ok := i.([]interface{}) if !ok { return []NoteDiscoveryAnalysisKindEnum{} } if len(a) == 0 { return []NoteDiscoveryAnalysisKindEnum{} } items := make([]NoteDiscoveryAnalysisKindEnum, 0, len(a)) for _, item := range a { items = append(items, *flattenNoteDiscoveryAnalysisKindEnum(item.(interface{}))) } return items } // flattenNoteDiscoveryAnalysisKindEnum asserts that an interface is a string, and returns a // pointer to a *NoteDiscoveryAnalysisKindEnum with the same value as that string. func flattenNoteDiscoveryAnalysisKindEnum(i interface{}) *NoteDiscoveryAnalysisKindEnum { s, ok := i.(string) if !ok { return nil } return NoteDiscoveryAnalysisKindEnumRef(s) } // This function returns a matcher that checks whether a serialized resource matches this resource // in its parameters (as defined by the fields in a Get, which definitionally define resource // identity). This is useful in extracting the element from a List call. func (r *Note) matcher(c *Client) func([]byte) bool { return func(b []byte) bool { cr, err := unmarshalNote(b, c, r) if err != nil { c.Config.Logger.Warning("failed to unmarshal provided resource in matcher.") return false } nr := r.urlNormalized() ncr := cr.urlNormalized() c.Config.Logger.Infof("looking for %v\nin %v", nr, ncr) if nr.Project == nil && ncr.Project == nil { c.Config.Logger.Info("Both Project fields null - considering equal.") } else if nr.Project == nil || ncr.Project == nil { c.Config.Logger.Info("Only one Project field is null - considering unequal.") return false } else if *nr.Project != *ncr.Project { return false } if nr.Name == nil && ncr.Name == nil { c.Config.Logger.Info("Both Name fields null - considering equal.") } else if nr.Name == nil || ncr.Name == nil { c.Config.Logger.Info("Only one Name field is null - considering unequal.") return false } else if *nr.Name != *ncr.Name { return false } return true } } type noteDiff struct { // The diff should include one or the other of RequiresRecreate or UpdateOp. RequiresRecreate bool UpdateOp noteApiOperation FieldName string // used for error logging } func convertFieldDiffsToNoteDiffs(config *dcl.Config, fds []*dcl.FieldDiff, opts []dcl.ApplyOption) ([]noteDiff, error) { opNamesToFieldDiffs := make(map[string][]*dcl.FieldDiff) // Map each operation name to the field diffs associated with it. for _, fd := range fds { for _, ro := range fd.ResultingOperation { if fieldDiffs, ok := opNamesToFieldDiffs[ro]; ok { fieldDiffs = append(fieldDiffs, fd) opNamesToFieldDiffs[ro] = fieldDiffs } else { config.Logger.Infof("%s required due to diff: %v", ro, fd) opNamesToFieldDiffs[ro] = []*dcl.FieldDiff{fd} } } } var diffs []noteDiff // For each operation name, create a noteDiff which contains the operation. for opName, fieldDiffs := range opNamesToFieldDiffs { // Use the first field diff's field name for logging required recreate error. diff := noteDiff{FieldName: fieldDiffs[0].FieldName} if opName == "Recreate" { diff.RequiresRecreate = true } else { apiOp, err := convertOpNameToNoteApiOperation(opName, fieldDiffs, opts...) if err != nil { return diffs, err } diff.UpdateOp = apiOp } diffs = append(diffs, diff) } return diffs, nil } func convertOpNameToNoteApiOperation(opName string, fieldDiffs []*dcl.FieldDiff, opts ...dcl.ApplyOption) (noteApiOperation, error) { switch opName { case "updateNoteUpdateNoteOperation": return &updateNoteUpdateNoteOperation{FieldDiffs: fieldDiffs}, nil default: return nil, fmt.Errorf("no such operation with name: %v", opName) } } func extractNoteFields(r *Note) error { vVulnerability := r.Vulnerability if vVulnerability == nil { // note: explicitly not the empty object. vVulnerability = &NoteVulnerability{} } if err := extractNoteVulnerabilityFields(r, vVulnerability); err != nil { return err } if !dcl.IsEmptyValueIndirect(vVulnerability) { r.Vulnerability = vVulnerability } vBuild := r.Build if vBuild == nil { // note: explicitly not the empty object. vBuild = &NoteBuild{} } if err := extractNoteBuildFields(r, vBuild); err != nil { return err } if !dcl.IsEmptyValueIndirect(vBuild) { r.Build = vBuild } vImage := r.Image if vImage == nil { // note: explicitly not the empty object. vImage = &NoteImage{} } if err := extractNoteImageFields(r, vImage); err != nil { return err } if !dcl.IsEmptyValueIndirect(vImage) { r.Image = vImage } vPackage := r.Package if vPackage == nil { // note: explicitly not the empty object. vPackage = &NotePackage{} } if err := extractNotePackageFields(r, vPackage); err != nil { return err } if !dcl.IsEmptyValueIndirect(vPackage) { r.Package = vPackage } vDiscovery := r.Discovery if vDiscovery == nil { // note: explicitly not the empty object. vDiscovery = &NoteDiscovery{} } if err := extractNoteDiscoveryFields(r, vDiscovery); err != nil { return err } if !dcl.IsEmptyValueIndirect(vDiscovery) { r.Discovery = vDiscovery } vDeployment := r.Deployment if vDeployment == nil { // note: explicitly not the empty object. vDeployment = &NoteDeployment{} } if err := extractNoteDeploymentFields(r, vDeployment); err != nil { return err } if !dcl.IsEmptyValueIndirect(vDeployment) { r.Deployment = vDeployment } vAttestation := r.Attestation if vAttestation == nil { // note: explicitly not the empty object. vAttestation = &NoteAttestation{} } if err := extractNoteAttestationFields(r, vAttestation); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAttestation) { r.Attestation = vAttestation } return nil } func extractNoteRelatedUrlFields(r *Note, o *NoteRelatedUrl) error { return nil } func extractNoteVulnerabilityFields(r *Note, o *NoteVulnerability) error { vCvssV3 := o.CvssV3 if vCvssV3 == nil { // note: explicitly not the empty object. vCvssV3 = &NoteVulnerabilityCvssV3{} } if err := extractNoteVulnerabilityCvssV3Fields(r, vCvssV3); err != nil { return err } if !dcl.IsEmptyValueIndirect(vCvssV3) { o.CvssV3 = vCvssV3 } return nil } func extractNoteVulnerabilityDetailsFields(r *Note, o *NoteVulnerabilityDetails) error { vAffectedVersionStart := o.AffectedVersionStart if vAffectedVersionStart == nil { // note: explicitly not the empty object. vAffectedVersionStart = &NoteVulnerabilityDetailsAffectedVersionStart{} } if err := extractNoteVulnerabilityDetailsAffectedVersionStartFields(r, vAffectedVersionStart); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAffectedVersionStart) { o.AffectedVersionStart = vAffectedVersionStart } vAffectedVersionEnd := o.AffectedVersionEnd if vAffectedVersionEnd == nil { // note: explicitly not the empty object. vAffectedVersionEnd = &NoteVulnerabilityDetailsAffectedVersionEnd{} } if err := extractNoteVulnerabilityDetailsAffectedVersionEndFields(r, vAffectedVersionEnd); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAffectedVersionEnd) { o.AffectedVersionEnd = vAffectedVersionEnd } vFixedVersion := o.FixedVersion if vFixedVersion == nil { // note: explicitly not the empty object. vFixedVersion = &NoteVulnerabilityDetailsFixedVersion{} } if err := extractNoteVulnerabilityDetailsFixedVersionFields(r, vFixedVersion); err != nil { return err } if !dcl.IsEmptyValueIndirect(vFixedVersion) { o.FixedVersion = vFixedVersion } return nil } func extractNoteVulnerabilityDetailsAffectedVersionStartFields(r *Note, o *NoteVulnerabilityDetailsAffectedVersionStart) error { return nil } func extractNoteVulnerabilityDetailsAffectedVersionEndFields(r *Note, o *NoteVulnerabilityDetailsAffectedVersionEnd) error { return nil } func extractNoteVulnerabilityDetailsFixedVersionFields(r *Note, o *NoteVulnerabilityDetailsFixedVersion) error { return nil } func extractNoteVulnerabilityCvssV3Fields(r *Note, o *NoteVulnerabilityCvssV3) error { return nil } func extractNoteVulnerabilityWindowsDetailsFields(r *Note, o *NoteVulnerabilityWindowsDetails) error { return nil } func extractNoteVulnerabilityWindowsDetailsFixingKbsFields(r *Note, o *NoteVulnerabilityWindowsDetailsFixingKbs) error { return nil } func extractNoteBuildFields(r *Note, o *NoteBuild) error { vSignature := o.Signature if vSignature == nil { // note: explicitly not the empty object. vSignature = &NoteBuildSignature{} } if err := extractNoteBuildSignatureFields(r, vSignature); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSignature) { o.Signature = vSignature } return nil } func extractNoteBuildSignatureFields(r *Note, o *NoteBuildSignature) error { return nil } func extractNoteImageFields(r *Note, o *NoteImage) error { vFingerprint := o.Fingerprint if vFingerprint == nil { // note: explicitly not the empty object. vFingerprint = &NoteImageFingerprint{} } if err := extractNoteImageFingerprintFields(r, vFingerprint); err != nil { return err } if !dcl.IsEmptyValueIndirect(vFingerprint) { o.Fingerprint = vFingerprint } return nil } func extractNoteImageFingerprintFields(r *Note, o *NoteImageFingerprint) error { return nil } func extractNotePackageFields(r *Note, o *NotePackage) error { return nil } func extractNotePackageDistributionFields(r *Note, o *NotePackageDistribution) error { vLatestVersion := o.LatestVersion if vLatestVersion == nil { // note: explicitly not the empty object. vLatestVersion = &NotePackageDistributionLatestVersion{} } if err := extractNotePackageDistributionLatestVersionFields(r, vLatestVersion); err != nil { return err } if !dcl.IsEmptyValueIndirect(vLatestVersion) { o.LatestVersion = vLatestVersion } return nil } func extractNotePackageDistributionLatestVersionFields(r *Note, o *NotePackageDistributionLatestVersion) error { return nil } func extractNoteDiscoveryFields(r *Note, o *NoteDiscovery) error { return nil } func extractNoteDeploymentFields(r *Note, o *NoteDeployment) error { return nil } func extractNoteAttestationFields(r *Note, o *NoteAttestation) error { vHint := o.Hint if vHint == nil { // note: explicitly not the empty object. vHint = &NoteAttestationHint{} } if err := extractNoteAttestationHintFields(r, vHint); err != nil { return err } if !dcl.IsEmptyValueIndirect(vHint) { o.Hint = vHint } return nil } func extractNoteAttestationHintFields(r *Note, o *NoteAttestationHint) error { return nil } func postReadExtractNoteFields(r *Note) error { vVulnerability := r.Vulnerability if vVulnerability == nil { // note: explicitly not the empty object. vVulnerability = &NoteVulnerability{} } if err := postReadExtractNoteVulnerabilityFields(r, vVulnerability); err != nil { return err } if !dcl.IsEmptyValueIndirect(vVulnerability) { r.Vulnerability = vVulnerability } vBuild := r.Build if vBuild == nil { // note: explicitly not the empty object. vBuild = &NoteBuild{} } if err := postReadExtractNoteBuildFields(r, vBuild); err != nil { return err } if !dcl.IsEmptyValueIndirect(vBuild) { r.Build = vBuild } vImage := r.Image if vImage == nil { // note: explicitly not the empty object. vImage = &NoteImage{} } if err := postReadExtractNoteImageFields(r, vImage); err != nil { return err } if !dcl.IsEmptyValueIndirect(vImage) { r.Image = vImage } vPackage := r.Package if vPackage == nil { // note: explicitly not the empty object. vPackage = &NotePackage{} } if err := postReadExtractNotePackageFields(r, vPackage); err != nil { return err } if !dcl.IsEmptyValueIndirect(vPackage) { r.Package = vPackage } vDiscovery := r.Discovery if vDiscovery == nil { // note: explicitly not the empty object. vDiscovery = &NoteDiscovery{} } if err := postReadExtractNoteDiscoveryFields(r, vDiscovery); err != nil { return err } if !dcl.IsEmptyValueIndirect(vDiscovery) { r.Discovery = vDiscovery } vDeployment := r.Deployment if vDeployment == nil { // note: explicitly not the empty object. vDeployment = &NoteDeployment{} } if err := postReadExtractNoteDeploymentFields(r, vDeployment); err != nil { return err } if !dcl.IsEmptyValueIndirect(vDeployment) { r.Deployment = vDeployment } vAttestation := r.Attestation if vAttestation == nil { // note: explicitly not the empty object. vAttestation = &NoteAttestation{} } if err := postReadExtractNoteAttestationFields(r, vAttestation); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAttestation) { r.Attestation = vAttestation } return nil } func postReadExtractNoteRelatedUrlFields(r *Note, o *NoteRelatedUrl) error { return nil } func postReadExtractNoteVulnerabilityFields(r *Note, o *NoteVulnerability) error { vCvssV3 := o.CvssV3 if vCvssV3 == nil { // note: explicitly not the empty object. vCvssV3 = &NoteVulnerabilityCvssV3{} } if err := extractNoteVulnerabilityCvssV3Fields(r, vCvssV3); err != nil { return err } if !dcl.IsEmptyValueIndirect(vCvssV3) { o.CvssV3 = vCvssV3 } return nil } func postReadExtractNoteVulnerabilityDetailsFields(r *Note, o *NoteVulnerabilityDetails) error { vAffectedVersionStart := o.AffectedVersionStart if vAffectedVersionStart == nil { // note: explicitly not the empty object. vAffectedVersionStart = &NoteVulnerabilityDetailsAffectedVersionStart{} } if err := extractNoteVulnerabilityDetailsAffectedVersionStartFields(r, vAffectedVersionStart); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAffectedVersionStart) { o.AffectedVersionStart = vAffectedVersionStart } vAffectedVersionEnd := o.AffectedVersionEnd if vAffectedVersionEnd == nil { // note: explicitly not the empty object. vAffectedVersionEnd = &NoteVulnerabilityDetailsAffectedVersionEnd{} } if err := extractNoteVulnerabilityDetailsAffectedVersionEndFields(r, vAffectedVersionEnd); err != nil { return err } if !dcl.IsEmptyValueIndirect(vAffectedVersionEnd) { o.AffectedVersionEnd = vAffectedVersionEnd } vFixedVersion := o.FixedVersion if vFixedVersion == nil { // note: explicitly not the empty object. vFixedVersion = &NoteVulnerabilityDetailsFixedVersion{} } if err := extractNoteVulnerabilityDetailsFixedVersionFields(r, vFixedVersion); err != nil { return err } if !dcl.IsEmptyValueIndirect(vFixedVersion) { o.FixedVersion = vFixedVersion } return nil } func postReadExtractNoteVulnerabilityDetailsAffectedVersionStartFields(r *Note, o *NoteVulnerabilityDetailsAffectedVersionStart) error { return nil } func postReadExtractNoteVulnerabilityDetailsAffectedVersionEndFields(r *Note, o *NoteVulnerabilityDetailsAffectedVersionEnd) error { return nil } func postReadExtractNoteVulnerabilityDetailsFixedVersionFields(r *Note, o *NoteVulnerabilityDetailsFixedVersion) error { return nil } func postReadExtractNoteVulnerabilityCvssV3Fields(r *Note, o *NoteVulnerabilityCvssV3) error { return nil } func postReadExtractNoteVulnerabilityWindowsDetailsFields(r *Note, o *NoteVulnerabilityWindowsDetails) error { return nil } func postReadExtractNoteVulnerabilityWindowsDetailsFixingKbsFields(r *Note, o *NoteVulnerabilityWindowsDetailsFixingKbs) error { return nil } func postReadExtractNoteBuildFields(r *Note, o *NoteBuild) error { vSignature := o.Signature if vSignature == nil { // note: explicitly not the empty object. vSignature = &NoteBuildSignature{} } if err := extractNoteBuildSignatureFields(r, vSignature); err != nil { return err } if !dcl.IsEmptyValueIndirect(vSignature) { o.Signature = vSignature } return nil } func postReadExtractNoteBuildSignatureFields(r *Note, o *NoteBuildSignature) error { return nil } func postReadExtractNoteImageFields(r *Note, o *NoteImage) error { vFingerprint := o.Fingerprint if vFingerprint == nil { // note: explicitly not the empty object. vFingerprint = &NoteImageFingerprint{} } if err := extractNoteImageFingerprintFields(r, vFingerprint); err != nil { return err } if !dcl.IsEmptyValueIndirect(vFingerprint) { o.Fingerprint = vFingerprint } return nil } func postReadExtractNoteImageFingerprintFields(r *Note, o *NoteImageFingerprint) error { return nil } func postReadExtractNotePackageFields(r *Note, o *NotePackage) error { return nil } func postReadExtractNotePackageDistributionFields(r *Note, o *NotePackageDistribution) error { vLatestVersion := o.LatestVersion if vLatestVersion == nil { // note: explicitly not the empty object. vLatestVersion = &NotePackageDistributionLatestVersion{} } if err := extractNotePackageDistributionLatestVersionFields(r, vLatestVersion); err != nil { return err } if !dcl.IsEmptyValueIndirect(vLatestVersion) { o.LatestVersion = vLatestVersion } return nil } func postReadExtractNotePackageDistributionLatestVersionFields(r *Note, o *NotePackageDistributionLatestVersion) error { return nil } func postReadExtractNoteDiscoveryFields(r *Note, o *NoteDiscovery) error { return nil } func postReadExtractNoteDeploymentFields(r *Note, o *NoteDeployment) error { return nil } func postReadExtractNoteAttestationFields(r *Note, o *NoteAttestation) error { vHint := o.Hint if vHint == nil { // note: explicitly not the empty object. vHint = &NoteAttestationHint{} } if err := extractNoteAttestationHintFields(r, vHint); err != nil { return err } if !dcl.IsEmptyValueIndirect(vHint) { o.Hint = vHint } return nil } func postReadExtractNoteAttestationHintFields(r *Note, o *NoteAttestationHint) error { return nil }