You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							148 lines
						
					
					
						
							3.9 KiB
						
					
					
				| 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 | |
| } | |
| 
 | |
| // MarshalXML encodes Prefix field into an XML form. | |
| func (p Prefix) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error { | |
| 	if !p.set { | |
| 		return nil | |
| 	} | |
| 	return e.EncodeElement(p.string, startElement) | |
| } | |
| 
 | |
| // MarshalXML encodes Filter field into an XML form. | |
| 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}) | |
| } | |
| 
 | |
| // 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"` | |
| 	Date         ExpirationDate     `xml:"Date,omitempty"` | |
| 	DeleteMarker ExpireDeleteMarker `xml:"ExpiredObjectDeleteMarker"` | |
| 
 | |
| 	set bool | |
| } | |
| 
 | |
| // 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) | |
| } | |
| 
 | |
| // ExpireDeleteMarker represents value of ExpiredObjectDeleteMarker field in Expiration XML element. | |
| type ExpireDeleteMarker struct { | |
| 	val bool | |
| 	set bool | |
| } | |
| 
 | |
| // 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) | |
| } | |
| 
 | |
| // 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 | |
| } | |
| 
 | |
| // 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) | |
| } | |
| 
 | |
| // TransitionDays is a type alias to unmarshal Days in Transition | |
| type TransitionDays int
 |