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

package com.hypixel.hytale.protocol.io;

import javax.annotation.Nonnull;

public class ProtocolException extends RuntimeException
{
    public ProtocolException(@Nonnull final String message) {
        super(message);
    }
    
    public ProtocolException(@Nonnull final String message, @Nonnull final Throwable cause) {
        super(message, cause);
    }
    
    @Nonnull
    public static ProtocolException arrayTooLong(@Nonnull final String fieldName, final int actual, final int max) {
        return new ProtocolException(fieldName + ": array length " + actual + " exceeds maximum " + max);
    }
    
    @Nonnull
    public static ProtocolException stringTooLong(@Nonnull final String fieldName, final int actual, final int max) {
        return new ProtocolException(fieldName + ": string length " + actual + " exceeds maximum " + max);
    }
    
    @Nonnull
    public static ProtocolException dictionaryTooLarge(@Nonnull final String fieldName, final int actual, final int max) {
        return new ProtocolException(fieldName + ": dictionary count " + actual + " exceeds maximum " + max);
    }
    
    @Nonnull
    public static ProtocolException bufferTooSmall(@Nonnull final String fieldName, final int required, final int available) {
        return new ProtocolException(fieldName + ": buffer too small, need " + required + " bytes but only " + available + " available");
    }
    
    @Nonnull
    public static ProtocolException invalidVarInt(@Nonnull final String fieldName) {
        return new ProtocolException(fieldName + ": invalid or incomplete VarInt");
    }
    
    @Nonnull
    public static ProtocolException negativeLength(@Nonnull final String fieldName, final int value) {
        return new ProtocolException(fieldName + ": negative length " + value);
    }
    
    @Nonnull
    public static ProtocolException invalidOffset(@Nonnull final String fieldName, final int offset, final int bufferLength) {
        return new ProtocolException(fieldName + ": offset " + offset + " is out of bounds (buffer length: " + bufferLength);
    }
    
    @Nonnull
    public static ProtocolException unknownPolymorphicType(@Nonnull final String typeName, final int typeId) {
        return new ProtocolException(typeName + ": unknown polymorphic type ID " + typeId);
    }
    
    @Nonnull
    public static ProtocolException duplicateKey(@Nonnull final String fieldName, @Nonnull final Object key) {
        return new ProtocolException(fieldName + ": duplicate key '" + String.valueOf(key));
    }
    
    @Nonnull
    public static ProtocolException invalidEnumValue(@Nonnull final String enumName, final int value) {
        return new ProtocolException(enumName + ": invalid enum value " + value);
    }
    
    @Nonnull
    public static ProtocolException arrayTooShort(@Nonnull final String fieldName, final int actual, final int min) {
        return new ProtocolException(fieldName + ": array length " + actual + " is below minimum " + min);
    }
    
    @Nonnull
    public static ProtocolException stringTooShort(@Nonnull final String fieldName, final int actual, final int min) {
        return new ProtocolException(fieldName + ": string length " + actual + " is below minimum " + min);
    }
    
    @Nonnull
    public static ProtocolException dictionaryTooSmall(@Nonnull final String fieldName, final int actual, final int min) {
        return new ProtocolException(fieldName + ": dictionary count " + actual + " is below minimum " + min);
    }
    
    @Nonnull
    public static ProtocolException valueOutOfRange(@Nonnull final String fieldName, @Nonnull final Object value, final double min, final double max) {
        return new ProtocolException(fieldName + ": value " + String.valueOf(value) + " is outside allowed range [" + min + ", " + max);
    }
    
    @Nonnull
    public static ProtocolException valueBelowMinimum(@Nonnull final String fieldName, @Nonnull final Object value, final double min) {
        return new ProtocolException(fieldName + ": value " + String.valueOf(value) + " is below minimum " + min);
    }
    
    @Nonnull
    public static ProtocolException valueAboveMaximum(@Nonnull final String fieldName, @Nonnull final Object value, final double max) {
        return new ProtocolException(fieldName + ": value " + String.valueOf(value) + " exceeds maximum " + max);
    }
}
