package com.googlecode.prolog_cafe.exceptions;

import com.googlecode.prolog_cafe.lang.StructureTerm;
import com.googlecode.prolog_cafe.lang.SymbolTerm;
import com.googlecode.prolog_cafe.lang.Term;

/**
 * Internal error.<br>
 *
 * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
 * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
 * @version 1.0
 */
public class InternalException extends PrologException {
    private static final long serialVersionUID = 1L;

    /** A functor symbol of <code>internal_error/1</code>. */
    public static final SymbolTerm INTERNAL_ERROR = SymbolTerm.intern("internal_error", 1);

    /** Holds a message. */
    public String message;

    /** Constructs a new <code>InternalException</code> with a message. */
    public InternalException(String _message) {
	message = _message;
    }

    /** Returns a term representation of this <code>InternalException</code>:
     * <code>internal_error(message)</code>.
     */
    @Override
    public Term getMessageTerm() {
	Term[] args = {SymbolTerm.create(message)};
	return new StructureTerm(INTERNAL_ERROR, args);
    }

    /** Returns a string representation of this <code>InternalException</code>. */
    @Override
    public String toString() {
	String s = "{INTERNAL ERROR: " + message;
	s += "}";
	return s;
    }
}
