// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_ERRORS_H_
#define SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_ERRORS_H_

#include <lib/syslog/cpp/macros.h>

#include <string>

#include "src/developer/forensics/utils/errors.h"

namespace forensics {
namespace feedback_data {

// Provide a reason why |error| occurred that is specific to feedback data collection.
inline std::string ToReason(const Error error) {
  switch (error) {
    case Error::kLogicError:
      return "feedback logic error";
    case Error::kTimeout:
      return "data collection timeout";
    case Error::kConnectionError:
      return "FIDL connection error";
    case Error::kAsyncTaskPostFailure:
      return "async post task failure";
    case Error::kMissingValue:
      return "no data returned";
    case Error::kBadValue:
      return "bad data returned";
    case Error::kFileReadFailure:
      return "file read failure";
    case Error::kFileWriteFailure:
      return "file write failure";
    case Error::kDefault:
      FX_LOGS(FATAL) << "Error::kDefault does not have a reason";
    case Error::kNotSet:
      FX_LOGS(FATAL) << "Error::kNotSet does not have a reason";
      return "FATAL, THIS SHOULD NOT HAPPEN";
  }
}

}  // namespace feedback_data
}  // namespace forensics

#endif  // SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_ERRORS_H_
