001/*
002 * Copyright (C) 2022 - 2024, the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *    http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.github.ascopes.jct.repr;
017
018import java.util.List;
019import org.assertj.core.presentation.Representation;
020import org.jspecify.annotations.Nullable;
021
022/**
023 * Representation of a {@link List list} of {@link StackTraceElement stack trace frames}.
024 *
025 * @author Ashley Scopes
026 * @since 0.0.1
027 */
028public final class StackTraceRepresentation implements Representation {
029
030  private static final StackTraceRepresentation INSTANCE = new StackTraceRepresentation();
031
032  /**
033   * Get an instance of this stack trace representation.
034   *
035   * @return the instance.
036   */
037  public static StackTraceRepresentation getInstance() {
038    return INSTANCE;
039  }
040
041  private StackTraceRepresentation() {
042    // Nothing to see here, move along now!
043  }
044
045  @Override
046  @SuppressWarnings("unchecked")
047  public String toStringOf(@Nullable Object object) {
048    if (object == null) {
049      return "null";
050    }
051
052    var trace = (List<? extends StackTraceElement>) object;
053    var builder = new StringBuilder("Stacktrace:");
054    for (var frame : trace) {
055      builder.append("\n\tat ").append(frame);
056    }
057    return builder.toString();
058  }
059}