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

package io.netty.handler.codec.http3;

import io.netty.util.AsciiString;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
import java.util.Iterator;
import io.netty.handler.codec.Headers;

public interface Http3Headers extends Headers<CharSequence, CharSequence, Http3Headers>
{
    Iterator<Map.Entry<CharSequence, CharSequence>> iterator();
    
    Iterator<CharSequence> valueIterator(final CharSequence p0);
    
    Http3Headers method(final CharSequence p0);
    
    Http3Headers scheme(final CharSequence p0);
    
    Http3Headers authority(final CharSequence p0);
    
    Http3Headers path(final CharSequence p0);
    
    Http3Headers status(final CharSequence p0);
    
    default Http3Headers protocol(final CharSequence value) {
        ((Headers<AsciiString, CharSequence, Headers>)this).set(PseudoHeaderName.PROTOCOL.value(), value);
        return this;
    }
    
    @Nullable
    CharSequence method();
    
    @Nullable
    CharSequence scheme();
    
    @Nullable
    CharSequence authority();
    
    @Nullable
    CharSequence path();
    
    @Nullable
    CharSequence status();
    
    @Nullable
    default CharSequence protocol() {
        return ((Headers<AsciiString, CharSequence, T>)this).get(PseudoHeaderName.PROTOCOL.value());
    }
    
    boolean contains(final CharSequence p0, final CharSequence p1, final boolean p2);
    
    public enum PseudoHeaderName
    {
        METHOD(":method", true, 1), 
        SCHEME(":scheme", true, 2), 
        AUTHORITY(":authority", true, 4), 
        PATH(":path", true, 8), 
        STATUS(":status", false, 16), 
        PROTOCOL(":protocol", true, 32);
        
        private static final char PSEUDO_HEADER_PREFIX = ':';
        private static final byte PSEUDO_HEADER_PREFIX_BYTE = 58;
        private final AsciiString value;
        private final boolean requestOnly;
        private final int flag;
        private static final CharSequenceMap<PseudoHeaderName> PSEUDO_HEADERS;
        
        private PseudoHeaderName(final String value, final boolean requestOnly, final int flag) {
            this.value = AsciiString.cached(value);
            this.requestOnly = requestOnly;
            this.flag = flag;
        }
        
        public AsciiString value() {
            return this.value;
        }
        
        public static boolean hasPseudoHeaderFormat(final CharSequence headerName) {
            if (headerName instanceof AsciiString) {
                final AsciiString asciiHeaderName = (AsciiString)headerName;
                return asciiHeaderName.length() > 0 && asciiHeaderName.byteAt(0) == 58;
            }
            return headerName.length() > 0 && headerName.charAt(0) == ':';
        }
        
        public static boolean isPseudoHeader(final CharSequence name) {
            return PseudoHeaderName.PSEUDO_HEADERS.contains(name);
        }
        
        @Nullable
        public static PseudoHeaderName getPseudoHeader(final CharSequence name) {
            return PseudoHeaderName.PSEUDO_HEADERS.get(name);
        }
        
        public boolean isRequestOnly() {
            return this.requestOnly;
        }
        
        public int getFlag() {
            return this.flag;
        }
        
        static {
            PSEUDO_HEADERS = new CharSequenceMap<PseudoHeaderName>();
            for (final PseudoHeaderName pseudoHeader : values()) {
                PseudoHeaderName.PSEUDO_HEADERS.add(pseudoHeader.value(), pseudoHeader);
            }
        }
    }
}
