2021-10-11 10:03:56 +00:00
|
|
|
package s3api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/xml"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Status represents lifecycle configuration status
|
|
|
|
type ruleStatus string
|
|
|
|
|
|
|
|
// Supported status types
|
|
|
|
const (
|
|
|
|
Enabled ruleStatus = "Enabled"
|
|
|
|
Disabled ruleStatus = "Disabled"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Lifecycle - Configuration for bucket lifecycle.
|
|
|
|
type Lifecycle struct {
|
|
|
|
XMLName xml.Name `xml:"LifecycleConfiguration"`
|
|
|
|
Rules []Rule `xml:"Rule"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Rule - a rule for lifecycle configuration.
|
|
|
|
type Rule struct {
|
|
|
|
XMLName xml.Name `xml:"Rule"`
|
|
|
|
ID string `xml:"ID,omitempty"`
|
|
|
|
Status ruleStatus `xml:"Status"`
|
|
|
|
Filter Filter `xml:"Filter,omitempty"`
|
|
|
|
Prefix Prefix `xml:"Prefix,omitempty"`
|
|
|
|
Expiration Expiration `xml:"Expiration,omitempty"`
|
|
|
|
Transition Transition `xml:"Transition,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Filter - a filter for a lifecycle configuration Rule.
|
|
|
|
type Filter struct {
|
|
|
|
XMLName xml.Name `xml:"Filter"`
|
|
|
|
set bool
|
|
|
|
|
|
|
|
Prefix Prefix
|
|
|
|
|
|
|
|
And And
|
|
|
|
andSet bool
|
|
|
|
|
|
|
|
Tag Tag
|
|
|
|
tagSet bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// Prefix holds the prefix xml tag in <Rule> and <Filter>
|
|
|
|
type Prefix struct {
|
|
|
|
string
|
|
|
|
set bool
|
|
|
|
}
|
|
|
|
|
2021-10-13 20:35:33 +00:00
|
|
|
// MarshalXML - decodes XML data.
|
|
|
|
func (p Prefix) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
|
|
|
|
if !p.set {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return e.EncodeElement(p.string, startElement)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f Filter) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
|
|
|
|
if err := e.EncodeToken(start); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := e.EncodeElement(f.Prefix, xml.StartElement{Name: xml.Name{Local: "Prefix"}}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return e.EncodeToken(xml.EndElement{Name: start.Name})
|
|
|
|
}
|
|
|
|
|
2021-10-11 10:03:56 +00:00
|
|
|
// 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"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expiration - expiration actions for a rule in lifecycle configuration.
|
|
|
|
type Expiration struct {
|
|
|
|
XMLName xml.Name `xml:"Expiration"`
|
|
|
|
Days int `xml:"Days,omitempty"`
|
2021-10-13 20:35:33 +00:00
|
|
|
Date ExpirationDate `xml:"Date,omitempty"`
|
2021-10-11 10:03:56 +00:00
|
|
|
DeleteMarker ExpireDeleteMarker `xml:"ExpiredObjectDeleteMarker"`
|
|
|
|
|
|
|
|
set bool
|
|
|
|
}
|
|
|
|
|
2021-10-13 20:35:33 +00:00
|
|
|
// MarshalXML encodes expiration field into an XML form.
|
|
|
|
func (e Expiration) MarshalXML(enc *xml.Encoder, startElement xml.StartElement) error {
|
|
|
|
if !e.set {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
type expirationWrapper Expiration
|
|
|
|
return enc.EncodeElement(expirationWrapper(e), startElement)
|
|
|
|
}
|
|
|
|
|
2021-10-11 10:03:56 +00:00
|
|
|
// ExpireDeleteMarker represents value of ExpiredObjectDeleteMarker field in Expiration XML element.
|
|
|
|
type ExpireDeleteMarker struct {
|
|
|
|
val bool
|
|
|
|
set bool
|
|
|
|
}
|
|
|
|
|
2021-10-13 20:35:33 +00:00
|
|
|
// MarshalXML encodes delete marker boolean into an XML form.
|
|
|
|
func (b ExpireDeleteMarker) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
|
|
|
|
if !b.set {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return e.EncodeElement(b.val, startElement)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExpirationDate is a embedded type containing time.Time to unmarshal
|
|
|
|
// Date in Expiration
|
|
|
|
type ExpirationDate struct {
|
|
|
|
time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalXML encodes expiration date if it is non-zero and encodes
|
|
|
|
// empty string otherwise
|
|
|
|
func (eDate ExpirationDate) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
|
|
|
|
if eDate.Time.IsZero() {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return e.EncodeElement(eDate.Format(time.RFC3339), startElement)
|
|
|
|
}
|
|
|
|
|
2021-10-11 10:03:56 +00:00
|
|
|
// Transition - transition actions for a rule in lifecycle configuration.
|
|
|
|
type Transition struct {
|
|
|
|
XMLName xml.Name `xml:"Transition"`
|
|
|
|
Days int `xml:"Days,omitempty"`
|
|
|
|
Date time.Time `xml:"Date,omitempty"`
|
|
|
|
StorageClass string `xml:"StorageClass,omitempty"`
|
|
|
|
|
|
|
|
set bool
|
|
|
|
}
|
|
|
|
|
2021-10-13 20:35:33 +00:00
|
|
|
// MarshalXML encodes transition field into an XML form.
|
|
|
|
func (t Transition) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {
|
|
|
|
if !t.set {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
type transitionWrapper Transition
|
|
|
|
return enc.EncodeElement(transitionWrapper(t), start)
|
|
|
|
}
|
|
|
|
|
2021-10-11 10:03:56 +00:00
|
|
|
// TransitionDays is a type alias to unmarshal Days in Transition
|
|
|
|
type TransitionDays int
|