// Copyright (c) 2015-2021 MinIO, Inc. // // This file is part of MinIO Object Storage stack // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package lifecycle import ( "encoding/xml" ) var errDuplicateTagKey = Errorf("Duplicate Tag Keys are not allowed") // And - a tag to combine a prefix and multiple tags for lifecycle configuration rule. type And struct { XMLName xml.Name `xml:"And"` Prefix Prefix `xml:"Prefix,omitempty"` Tags []Tag `xml:"Tag,omitempty"` } // isEmpty returns true if Tags field is null func (a And) isEmpty() bool { return len(a.Tags) == 0 && !a.Prefix.set } // Validate - validates the And field func (a And) Validate() error { emptyPrefix := !a.Prefix.set emptyTags := len(a.Tags) == 0 if emptyPrefix && emptyTags { return nil } if emptyPrefix && !emptyTags || !emptyPrefix && emptyTags { return errXMLNotWellFormed } 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 }