/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <string>

/**
 * @brief Result of the locking/unlocking file.
 * @note See @c cmFileLock
 */
class cmFileLockResult
{
public:
  using Error = int;

  /**
   * @brief Successful lock/unlock.
   */
  static cmFileLockResult MakeOk();

  /**
   * @brief Lock/Unlock failed. Read error/GetLastError.
   */
  static cmFileLockResult MakeSystem();

  /**
   * @brief Lock/Unlock failed. Timeout reached.
   */
  static cmFileLockResult MakeTimeout();

  /**
   * @brief File already locked.
   */
  static cmFileLockResult MakeAlreadyLocked();

  /**
   * @brief Internal error.
   */
  static cmFileLockResult MakeInternal();

  /**
   * @brief Try to lock with function guard outside of the function
   */
  static cmFileLockResult MakeNoFunction();

  bool IsOk() const;
  std::string GetOutputMessage() const;

private:
  enum ErrorType
  {
    OK,
    SYSTEM,
    TIMEOUT,
    ALREADY_LOCKED,
    INTERNAL,
    NO_FUNCTION
  };

  cmFileLockResult(ErrorType type, Error errorValue);

  ErrorType Type;
  Error ErrorValue;
};
