/*
 * Copyright (c) 2011 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.conversion;

import static com.google.common.collect.Maps.newHashMap;
import static java.lang.Double.*;
import static org.eclipse.xtext.util.Strings.isEmpty;

import java.util.Map;

import org.eclipse.xtext.conversion.ValueConverterException;
import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
import org.eclipse.xtext.nodemodel.INode;

/**
 * Converts floating-point numbers to {@code double}s.
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public class DOUBLEValueConverter extends AbstractLexerBasedConverter<Double> {
  private static final Map<String, Double> PREDEFINED_VALUES = newHashMap();

  static {
    PREDEFINED_VALUES.put("nan", NaN);
    PREDEFINED_VALUES.put("inf", POSITIVE_INFINITY);
    PREDEFINED_VALUES.put("-inf", NEGATIVE_INFINITY);
  }

  /**
   * Creates an {@code float} from the given input, if the given input represents a floating-point number.
   * @param string the given input.
   * @param node the parsed node including hidden parts.
   * @return the new {@code float}.
   * @throws ValueConverterException if the given input is {@code null}, empty or does not represent a floating-point
   * number.
   */
  @Override public Double toValue(String string, INode node) throws ValueConverterException {
    if (isEmpty(string)) {
      throw new ValueConverterException("Couldn't convert empty string to double.", node, null);
    }
    Double predefinedValue = PREDEFINED_VALUES.get(string);
    if (predefinedValue != null) {
      return predefinedValue;
    }
    try {
      return Double.parseDouble(string);
    } catch (NumberFormatException e) {
      throw parsingError(string, node, e);
    }
  }

  private ValueConverterException parsingError(String string, INode node, Exception cause) {
    return new ValueConverterException("Couldn't convert '" + string + "' to double.", node, cause);
  }
}
