package org.odata4j.core;

/**
 * A custom Boolean class is necessary to support Boolean representations as
 * defined in the OData standard.
 * <p>The name of this class pays homage to 
 * <a href="http://en.wikipedia.org/wiki/George_Boole">George Boole (1815–1864)</a>.</p>
 */
public enum Boole {
  TRUE(Boolean.TRUE, "true", "1"),
  FALSE(Boolean.FALSE, "false", "0");

  private Boolean booleanValue;
  private String value1, value2;

  Boole(Boolean booleanValue, String value1, String value2) {
    this.booleanValue = booleanValue;
    this.value1 = value1;
    this.value2 = value2;
  }

  public Boolean toBoolean() {
    return booleanValue;
  }

  /**
   * Convert a string value to {@link Boole}. 
   * @param  value OData string representation of a boolean value.
   * @throws IllegalArgumentException if {@code value} is not one of
   *         {@code true}, {@code false}, {@code 1}, or {@code 0}.
   * @return Boole
   */
  public static Boole fromString(String value) {
    for (Boole boole : Boole.values())
      if (value.equals(boole.value1) || value.equals(boole.value2))
        return boole;
    throw new IllegalArgumentException();
  }
}
