content: package alien4cloud.tosca.parser;
  
  import org.yaml.snakeyaml.error.Mark;
  import org.yaml.snakeyaml.error.MarkedYAMLException;
  
  import alien4cloud.tosca.parser.impl.ErrorCode;
  import lombok.Getter;
  import lombok.NoArgsConstructor;
  import lombok.Setter;
  import lombok.ToString;
  import lombok.extern.slf4j.Slf4j;
  
  /**
   * Contains error information relative to Yaml parsing.
   */
  @Getter
  @Setter
  @Slf4j
  @ToString
  @NoArgsConstructor
  public class ParsingError {
      private ParsingErrorLevel errorLevel;
      private ErrorCode errorCode;
      private String context;
      private SimpleMark startMark;
      private String problem;
      private SimpleMark endMark;
      private String note;
  
      public ParsingError(ParsingErrorLevel errorLevel, ErrorCode errorCode, String context, Mark startMark, String problem, Mark endMark, String note) {
          this.errorLevel = errorLevel;
          this.errorCode = errorCode;
          this.context = context;
          this.startMark = startMark == null ? null : new SimpleMark(startMark);
          this.problem = problem;
          this.endMark = endMark == null ? null : new SimpleMark(endMark);
          this.note = note;
          if (errorLevel == ParsingErrorLevel.ERROR) {
              // this is a handy place to put a breakpoint if you want to know where errors are coming from
              log.debug("Error found during parsing, rethrowing:\n" + this);
          }
      }
  
      public ParsingError(ErrorCode errorCode, String context, Mark startMark, String problem, Mark endMark, String note) {
          this(ParsingErrorLevel.ERROR, errorCode, context, startMark, problem, endMark, note);
      }
  
      /**
       * Create a new parsing error that is the same as the given parsing error but with a new level.
       * 
       * @param errorLevel The error level for the new error.
       * @param from The parsing error to clone.
       */
      public ParsingError(ParsingErrorLevel errorLevel, ParsingError from) {
          this.errorLevel = errorLevel;
          this.errorCode = from.errorCode;
          this.context = from.context;
          this.startMark = from.startMark;
          this.problem = from.problem;
          this.endMark = from.endMark;
          this.note = from.note;
      }
  
      public ParsingError(ErrorCode errorCode, MarkedYAMLException cause) {
          this(ParsingErrorLevel.ERROR, errorCode, cause.getContext(), cause.getContextMark() != null ? cause.getContextMark() : cause.getProblemMark(),
                  cause.getProblem(), cause.getProblemMark(), null);
      }
  }