//
// Copyright 2020 Swiftkube Project
//
// 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.
//

///
/// Generated by Swiftkube:ModelGen
/// Kubernetes v1.20.9
/// core.v1.ServicePort
///

import Foundation

public extension core.v1 {

	///
	/// ServicePort contains information on service's port.
	///
	struct ServicePort: KubernetesResource {
		///
		/// The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.
		///
		public var appProtocol: String?
		///
		/// The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. When considering the endpoints for a Service, this must match the 'name' field in the EndpointPort. Optional if only one ServicePort is defined on this service.
		///
		public var name: String?
		///
		/// The port on each node on which this service is exposed when type is NodePort or LoadBalancer.  Usually assigned by the system. If a value is specified, in-range, and not in use it will be used, otherwise the operation will fail.  If not specified, a port will be allocated if this Service requires one.  If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
		///
		public var nodePort: Int32?
		///
		/// The port that will be exposed by this service.
		///
		public var port: Int32
		///
		/// The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". Default is TCP.
		///
		public var `protocol`: String?
		///
		/// Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service
		///
		public var targetPort: IntOrString?
		///
		/// Default memberwise initializer
		///
		public init(
			appProtocol: String? = nil,
			name: String? = nil,
			nodePort: Int32? = nil,
			port: Int32,
			`protocol`: String? = nil,
			targetPort: IntOrString? = nil
		) {
			self.appProtocol = appProtocol
			self.name = name
			self.nodePort = nodePort
			self.port = port
			self.`protocol` = `protocol`
			self.targetPort = targetPort
		}
	}
}

///
/// Codable conformance
///
public extension core.v1.ServicePort {

	private enum CodingKeys: String, CodingKey {

		case appProtocol = "appProtocol"
		case name = "name"
		case nodePort = "nodePort"
		case port = "port"
		case `protocol` = "protocol"
		case targetPort = "targetPort"
	}

	init(from decoder: Decoder) throws {
		let container = try decoder.container(keyedBy: CodingKeys.self)
		self.appProtocol = try container.decodeIfPresent(String.self, forKey: .appProtocol)
		self.name = try container.decodeIfPresent(String.self, forKey: .name)
		self.nodePort = try container.decodeIfPresent(Int32.self, forKey: .nodePort)
		self.port = try container.decode(Int32.self, forKey: .port)
		self.`protocol` = try container.decodeIfPresent(String.self, forKey: .`protocol`)
		self.targetPort = try container.decodeIfPresent(IntOrString.self, forKey: .targetPort)
	}

	func encode(to encoder: Encoder) throws {
		var encodingContainer = encoder.container(keyedBy: CodingKeys.self)

		try encodingContainer.encode(appProtocol, forKey: .appProtocol)
		try encodingContainer.encode(name, forKey: .name)
		try encodingContainer.encode(nodePort, forKey: .nodePort)
		try encodingContainer.encode(port, forKey: .port)
		try encodingContainer.encode(`protocol`, forKey: .`protocol`)
		try encodingContainer.encode(targetPort, forKey: .targetPort)
	}
}
