func getOption0()

in Sources/NIOTransportServices/NIOTSConnectionChannel.swift [337:405]


    func getOption0<Option: ChannelOption>(option: Option) throws -> Option.Value {
        self.eventLoop.preconditionInEventLoop()

        guard !self.closed else {
            throw ChannelError.ioOnClosedChannel
        }

        switch option {
        case _ as ChannelOptions.Types.AutoReadOption:
            return self.options.autoRead as! Option.Value
        case _ as ChannelOptions.Types.AllowRemoteHalfClosureOption:
            return self.options.supportRemoteHalfClosure as! Option.Value
        case _ as ChannelOptions.Types.SocketOption:
            let optionValue = option as! ChannelOptions.Types.SocketOption

            // SO_REUSEADDR and SO_REUSEPORT are handled here.
            switch (optionValue.level, optionValue.name) {
            case (SOL_SOCKET, SO_REUSEADDR):
                return Int32(self.reuseAddress ? 1 : 0) as! Option.Value
            case (SOL_SOCKET, SO_REUSEPORT):
                return Int32(self.reusePort ? 1 : 0) as! Option.Value
            default:
                return try self.tcpOptions.valueFor(socketOption: optionValue) as! Option.Value
            }
        case _ as ChannelOptions.Types.WriteBufferWaterMarkOption:
            return self.backpressureManager.waterMarks as! Option.Value
        case _ as NIOTSChannelOptions.Types.NIOTSWaitForActivityOption:
            return self.options.waitForActivity as! Option.Value
        case is NIOTSChannelOptions.Types.NIOTSEnablePeerToPeerOption:
            return self.enablePeerToPeer as! Option.Value
        case is NIOTSChannelOptions.Types.NIOTSAllowLocalEndpointReuse:
            return self.allowLocalEndpointReuse as! Option.Value
        case is NIOTSChannelOptions.Types.NIOTSCurrentPathOption:
            guard let currentPath = self.nwConnection?.currentPath else {
                throw NIOTSErrors.NoCurrentPath()
            }
            return currentPath as! Option.Value
        case is NIOTSChannelOptions.Types.NIOTSMetadataOption:
            let optionValue = option as! NIOTSChannelOptions.Types.NIOTSMetadataOption
            guard let nwConnection = self.nwConnection else {
                throw NIOTSErrors.NoCurrentConnection()
            }
            return nwConnection.metadata(definition: optionValue.definition) as! Option.Value
        default:
            // watchOS 6.0 availability is covered by the @available on this extension.
            if #available(OSX 10.15, iOS 13.0, tvOS 13.0, *) {
                switch option {
                case is NIOTSChannelOptions.Types.NIOTSEstablishmentReportOption:
                    guard let nwConnection = self.nwConnection else {
                        throw NIOTSErrors.NoCurrentConnection()
                    }
                    let promise: EventLoopPromise<NWConnection.EstablishmentReport?> = eventLoop.makePromise()
                    nwConnection.requestEstablishmentReport(queue: connectionQueue) { report in
                        promise.succeed(report)
                    }
                    return promise.futureResult as! Option.Value
                case is NIOTSChannelOptions.Types.NIOTSDataTransferReportOption:
                    guard let nwConnection = self.nwConnection else {
                        throw NIOTSErrors.NoCurrentConnection()
                    }
                    return nwConnection.startDataTransferReport() as! Option.Value
                default:
                    break
                }
            }
            
            fatalError("option \(type(of: option)).\(option) not supported")
        }
    }