/* * MinIO Cloud Storage, (C) 2019 MinIO, Inc. * * 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 lifecycle import ( "encoding/xml" "github.com/minio/minio/pkg/bucket/object/tagging" ) // And - a tag to combine a prefix and multiple tags for lifecycle configuration rule. type And struct { XMLName xml.Name `xml:"And"` Prefix string `xml:"Prefix,omitempty"` Tags []tagging.Tag `xml:"Tag,omitempty"` } var errDuplicateTagKey = Errorf("Duplicate Tag Keys are not allowed") // isEmpty returns true if Tags field is null func (a And) isEmpty() bool { return len(a.Tags) == 0 && a.Prefix == "" } // Validate - validates the And field func (a And) Validate() error { if a.ContainsDuplicateTag() { return errDuplicateTagKey } for _, t := range a.Tags { if err := t.Validate(); err != nil { return err } } return nil } // ContainsDuplicateTag - returns true if duplicate keys are present in And func (a And) ContainsDuplicateTag() bool { x := make(map[string]struct{}, len(a.Tags)) for _, t := range a.Tags { if _, has := x[t.Key]; has { return true } x[t.Key] = struct{}{} } return false }