package edu.stanford.nlp.sempre;

import fig.basic.LispTree;

/**
 * Utilities for Value.
 *
 * @author Percy Liang
 */
public final class Values {
  private Values() { }

  // Try to parse the LispTree into a value.
  // If it fails, just return null.
  public static Value fromLispTreeOrNull(LispTree tree) {
    if (tree.isLeaf())
      return null;
    String type = tree.child(0).value;
    if ("name".equals(type)) return new NameValue(tree);
    if ("boolean".equals(type)) return new BooleanValue(tree);
    if ("number".equals(type)) return new NumberValue(tree);
    if ("string".equals(type)) return new StringValue(tree);
    if ("list".equals(type)) return new ListValue(tree);
    if ("table".equals(type)) return new TableValue(tree);
    if ("description".equals(type)) return new DescriptionValue(tree);
    if ("url".equals(type)) return new UriValue(tree);
    if ("context".equals(type)) return new ContextValue(tree);
    if ("date".equals(type)) return new DateValue(tree);
    if ("error".equals(type)) return new ErrorValue(tree);
    if ("time".equals(type)) return new TimeValue(tree);
    if ("triples".equals(type)) return new TripleValue(tree);
    if ("triple".equals(type)) return new TripleValue(tree);
    return null;
  }

  // Try to parse.  If it fails, throw an exception.
  public static Value fromLispTree(LispTree tree) {
    Value value = fromLispTreeOrNull(tree);
    if (value == null)
      throw new RuntimeException("Invalid value: " + tree);
    return value;
  }

  public static Value fromString(String s) { return fromLispTree(LispTree.proto.parseFromString(s)); }
}
