// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.codec.http3;

import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;
import io.netty.util.internal.StringUtil;
import io.netty.channel.ChannelPromise;
import org.jetbrains.annotations.Nullable;

final class Http3FrameValidationUtils
{
    private Http3FrameValidationUtils() {
    }
    
    private static <T> T cast(final Object msg) {
        return (T)msg;
    }
    
    private static <T> boolean isValid(final Class<T> frameType, final Object msg) {
        return frameType.isInstance(msg);
    }
    
    @Nullable
    static <T> T validateFrameWritten(final Class<T> expectedFrameType, final Object msg) {
        if (isValid(expectedFrameType, msg)) {
            return cast(msg);
        }
        return null;
    }
    
    @Nullable
    static <T> T validateFrameRead(final Class<T> expectedFrameType, final Object msg) {
        if (isValid(expectedFrameType, msg)) {
            return cast(msg);
        }
        return null;
    }
    
    static void frameTypeUnexpected(final ChannelPromise promise, final Object frame) {
        final String type = StringUtil.simpleClassName(frame);
        ReferenceCountUtil.release(frame);
        promise.setFailure((Throwable)new Http3Exception(Http3ErrorCode.H3_FRAME_UNEXPECTED, "Frame of type " + type + " unexpected"));
    }
    
    static void frameTypeUnexpected(final ChannelHandlerContext ctx, final Object frame) {
        ReferenceCountUtil.release(frame);
        Http3CodecUtils.connectionError(ctx, Http3ErrorCode.H3_FRAME_UNEXPECTED, "Frame type unexpected", true);
    }
}
