mutating func sendSettings()

in Sources/NIOHTTP2/ConnectionStateMachine/ConnectionStateMachine.swift [555:628]


    mutating func sendSettings(_ settings: HTTP2Settings) -> StateMachineResultWithEffect {
        let validationResult = self.validateSettings(settings)

        guard case .succeed = validationResult else {
            return .init(result: validationResult, effect: nil)
        }

        switch self.state {
        case .idle(let state):
            self.avoidingStateMachineCoW { newState in
                var settingsState = HTTP2SettingsState(localState: true)
                settingsState.emitSettings(settings)
                newState = .prefaceSent(.init(fromIdle: state, localSettings: settingsState))
            }

        case .prefaceReceived(let state):
            self.avoidingStateMachineCoW { newState in
                var settingsState = HTTP2SettingsState(localState: true)
                settingsState.emitSettings(settings)
                newState = .active(.init(fromPrefaceReceived: state, localSettings: settingsState))
            }

        case .prefaceSent(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .prefaceSent(state)
            }

        case .active(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .active(state)
            }

        case .quiescingPrefaceSent(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .quiescingPrefaceSent(state)
            }

        case .quiescingPrefaceReceived(let state):
            self.avoidingStateMachineCoW { newState in
                var settingsState = HTTP2SettingsState(localState: true)
                settingsState.emitSettings(settings)
                newState = .remotelyQuiesced(.init(fromQuiescingPrefaceReceived: state, localSettings: settingsState))
            }

        case .remotelyQuiesced(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .remotelyQuiesced(state)
            }

        case .locallyQuiesced(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .locallyQuiesced(state)
            }

        case .bothQuiescing(var state):
            self.avoidingStateMachineCoW { newState in
                state.localSettings.emitSettings(settings)
                newState = .bothQuiescing(state)
            }

        case .fullyQuiesced:
            return .init(result: .connectionError(underlyingError: NIOHTTP2Errors.ioOnClosedConnection(), type: .protocolError), effect: nil)

        case .modifying:
            preconditionFailure("Must not be left in modifying state")
        }

        return .init(result: .succeed, effect: nil)
    }