/**
 * Copyright (c) 2008-2009 Andrey Somov
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yaml.snakeyaml.scanner;

import java.util.List;

import org.yaml.snakeyaml.tokens.Token;

/**
 * This interface represents an input stream of {@link Token Tokens}.
 * <p>
 * The parser and the scanner form together the 'Parse' step in
 * the loading process (see chapter 3.1 of the 
 * <a href="http://yaml.org/spec/1.1/">YAML Specification</a>).
 * </p>
 *
 * @see org.yaml.snakeyaml.tokens.Token
 */
public interface Scanner {
	
    /**
     * Check if the next token is one of the given types.
	 *
     * @param choices List of token types.
     * @return <code>true</code>  if the next token can be assigned to a 
     * variable of at least one of the given types. Returns <code>false</code>
     * if no more tokens are available.
     * @throws ScannerException Thrown in case of malformed input.
     */
    boolean checkToken(List<Class<? extends Token>> choices);

    /**
     * Check if the next token is assignable to the given type.
     * <p>
     * This is a convenience method to avoid <code>List</code> creation if
     * calling {@link #checkToken(List)} for
     * a single type.
     * </p>
     * @param choice Token type.
     * @return True if the next token is an instance of <code>type</code>.
     * False if no more tokens are available.
     * @throws ScannerException Thrown in case of malformed input.
     */
    boolean checkToken(Class<? extends Token> choice);

    /**
     * Return the next token, but do not delete it from the stream.
     * @return The token that will be returned on the next call to {@link #getToken}
     * @throws ScannerException Thrown in case of malformed input.
     */
    Token peekToken();

    /**
     * Returns the next token.
     * <p>The token will be removed from the stream.</p>
     * @throws ScannerException Thrown in case of malformed input.
     */
    Token getToken();
}
