/*
 * IONOS Object Storage API for contract-owned buckets
 *
 * ## Overview The IONOS Object Storage API for contract-owned buckets is a REST-based API that allows developers and applications to interact directly with IONOS' scalable storage solution, leveraging the S3 protocol for object storage operations. Its design ensures seamless compatibility with existing tools and libraries tailored for S3 systems.  ### API References - [S3 API Reference for contract-owned buckets](https://api.ionos.com/docs/s3-contract-owned-buckets/v2/) ### User documentation [IONOS Object Storage User Guide](https://docs.ionos.com/cloud/managed-services/s3-object-storage) * [Documentation on user-owned and contract-owned buckets](https://docs.ionos.com/cloud/managed-services/s3-object-storage/concepts/buckets) * [Documentation on S3 API Compatibility](https://docs.ionos.com/cloud/managed-services/s3-object-storage/concepts/s3-api-compatibility) * [S3 Tools](https://docs.ionos.com/cloud/managed-services/s3-object-storage/s3-tools)  ## Endpoints for contract-owned buckets | Location | Region Name | Bucket Type | Endpoint | | --- | --- | --- | --- | | **Berlin, Germany** | **eu-central-3** | Contract-owned | `https://s3.eu-central-3.ionoscloud.com` |  ## Changelog - 30.05.2024 Initial version
 *
 * API version: 2.0.2
 * Contact: support@cloud.ionos.com
 */

// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.

package ionoscloud

import (
	"encoding/json"
)

import "encoding/xml"

// LifecycleExpiration Specifies when the object expires based on the values defined in the lifecycle configuration.
type LifecycleExpiration struct {
	XMLName xml.Name `xml:"Expiration"`
	// Indicates at what date the object is to be moved or deleted. Should be in GMT ISO 8601 Format.
	Date *string `json:"Date,omitempty" xml:"Date"`
	// Indicates the lifetime, in days, of the objects that are subject to the rule. The value must be a non-zero positive integer.
	Days *int32 `json:"Days,omitempty" xml:"Days"`
	// Indicates whether IONOS Object Storage will remove a delete marker with no noncurrent versions. If set to true, the delete marker will be expired; if set to false the policy takes no operation. This cannot be specified with Days or Date in a Lifecycle Expiration Policy.
	ExpiredObjectDeleteMarker *bool `json:"ExpiredObjectDeleteMarker,omitempty" xml:"ExpiredObjectDeleteMarker"`
}

// NewLifecycleExpiration instantiates a new LifecycleExpiration object
// This constructor will assign default values to properties that have it defined,
// and makes sure properties required by API are set, but the set of arguments
// will change when the set of required properties is changed
func NewLifecycleExpiration() *LifecycleExpiration {
	this := LifecycleExpiration{}

	return &this
}

// NewLifecycleExpirationWithDefaults instantiates a new LifecycleExpiration object
// This constructor will only assign default values to properties that have it defined,
// but it doesn't guarantee that properties required by API are set
func NewLifecycleExpirationWithDefaults() *LifecycleExpiration {
	this := LifecycleExpiration{}
	return &this
}

// GetDate returns the Date field value
// If the value is explicit nil, the zero value for string will be returned
func (o *LifecycleExpiration) GetDate() *string {
	if o == nil {
		return nil
	}

	return o.Date

}

// GetDateOk returns a tuple with the Date field value
// and a boolean to check if the value has been set.
// NOTE: If the value is an explicit nil, `nil, true` will be returned
func (o *LifecycleExpiration) GetDateOk() (*string, bool) {
	if o == nil {
		return nil, false
	}

	return o.Date, true
}

// SetDate sets field value
func (o *LifecycleExpiration) SetDate(v string) {

	o.Date = &v

}

// HasDate returns a boolean if a field has been set.
func (o *LifecycleExpiration) HasDate() bool {
	if o != nil && o.Date != nil {
		return true
	}

	return false
}

// GetDays returns the Days field value
// If the value is explicit nil, the zero value for int32 will be returned
func (o *LifecycleExpiration) GetDays() *int32 {
	if o == nil {
		return nil
	}

	return o.Days

}

// GetDaysOk returns a tuple with the Days field value
// and a boolean to check if the value has been set.
// NOTE: If the value is an explicit nil, `nil, true` will be returned
func (o *LifecycleExpiration) GetDaysOk() (*int32, bool) {
	if o == nil {
		return nil, false
	}

	return o.Days, true
}

// SetDays sets field value
func (o *LifecycleExpiration) SetDays(v int32) {

	o.Days = &v

}

// HasDays returns a boolean if a field has been set.
func (o *LifecycleExpiration) HasDays() bool {
	if o != nil && o.Days != nil {
		return true
	}

	return false
}

// GetExpiredObjectDeleteMarker returns the ExpiredObjectDeleteMarker field value
// If the value is explicit nil, the zero value for bool will be returned
func (o *LifecycleExpiration) GetExpiredObjectDeleteMarker() *bool {
	if o == nil {
		return nil
	}

	return o.ExpiredObjectDeleteMarker

}

// GetExpiredObjectDeleteMarkerOk returns a tuple with the ExpiredObjectDeleteMarker field value
// and a boolean to check if the value has been set.
// NOTE: If the value is an explicit nil, `nil, true` will be returned
func (o *LifecycleExpiration) GetExpiredObjectDeleteMarkerOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}

	return o.ExpiredObjectDeleteMarker, true
}

// SetExpiredObjectDeleteMarker sets field value
func (o *LifecycleExpiration) SetExpiredObjectDeleteMarker(v bool) {

	o.ExpiredObjectDeleteMarker = &v

}

// HasExpiredObjectDeleteMarker returns a boolean if a field has been set.
func (o *LifecycleExpiration) HasExpiredObjectDeleteMarker() bool {
	if o != nil && o.ExpiredObjectDeleteMarker != nil {
		return true
	}

	return false
}

func (o LifecycleExpiration) MarshalJSON() ([]byte, error) {
	toSerialize := map[string]interface{}{}
	if o.Date != nil {
		toSerialize["Date"] = o.Date
	}

	if o.Days != nil {
		toSerialize["Days"] = o.Days
	}

	if o.ExpiredObjectDeleteMarker != nil {
		toSerialize["ExpiredObjectDeleteMarker"] = o.ExpiredObjectDeleteMarker
	}

	return json.Marshal(toSerialize)
}

type NullableLifecycleExpiration struct {
	value *LifecycleExpiration
	isSet bool
}

func (v NullableLifecycleExpiration) Get() *LifecycleExpiration {
	return v.value
}

func (v *NullableLifecycleExpiration) Set(val *LifecycleExpiration) {
	v.value = val
	v.isSet = true
}

func (v NullableLifecycleExpiration) IsSet() bool {
	return v.isSet
}

func (v *NullableLifecycleExpiration) Unset() {
	v.value = nil
	v.isSet = false
}

func NewNullableLifecycleExpiration(val *LifecycleExpiration) *NullableLifecycleExpiration {
	return &NullableLifecycleExpiration{value: val, isSet: true}
}

func (v NullableLifecycleExpiration) MarshalJSON() ([]byte, error) {
	return json.Marshal(v.value)
}

func (v *NullableLifecycleExpiration) UnmarshalJSON(src []byte) error {
	v.isSet = true
	return json.Unmarshal(src, &v.value)
}
