/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * 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 com.facebook.buck.parser.exceptions;

import com.facebook.buck.core.util.immutables.BuckStyleValue;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;

/** Holds information about error occurred during parsing a build file */
@BuckStyleValue
@JsonDeserialize
public abstract class ParsingError {
  /** @return Human readable message of the error. */
  @JsonProperty("message")
  public abstract String getMessage();

  /** @return Parser stack trace to the errorred callsite, if any. */
  @JsonProperty("stacktrace")
  public abstract ImmutableList<String> getStackTrace();

  /** Transform regular Exception to parsing error object */
  public static ParsingError from(Exception ex) {
    return ImmutableParsingError.of(
        ex.getMessage(),
        Arrays.stream(ex.getStackTrace())
            .map(element -> element.toString())
            .collect(ImmutableList.toImmutableList()));
  }

  public static ParsingError of(String message, ImmutableList<String> stackTrace) {
    return ImmutableParsingError.of(message, stackTrace);
  }
}
