// Copyright 2023 The Tint Authors.
//
// 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.

////////////////////////////////////////////////////////////////////////////////
// File generated by 'tools/src/cmd/gen' using the template:
//   src/tint/lang/wgsl/diagnostic_severity.h.tmpl
//
// To regenerate run: './tools/run gen'
//
//                       Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#ifndef SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
#define SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_

#include <string>
#include <unordered_map>

#include "src/tint/lang/wgsl/diagnostic_rule.h"
#include "src/tint/utils/diagnostic/diagnostic.h"
#include "src/tint/utils/traits/traits.h"

namespace tint::wgsl {

/// The diagnostic severity control.
enum class DiagnosticSeverity : uint8_t {
    kUndefined,
    kError,
    kInfo,
    kOff,
    kWarning,
};

/// @param value the enum value
/// @returns the string for the given enum value
std::string_view ToString(DiagnosticSeverity value);

/// @param out the stream to write to
/// @param value the DiagnosticSeverity
/// @returns @p out so calls can be chained
template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
auto& operator<<(STREAM& out, DiagnosticSeverity value) {
    return out << ToString(value);
}

/// ParseDiagnosticSeverity parses a DiagnosticSeverity from a string.
/// @param str the string to parse
/// @returns the parsed enum, or DiagnosticSeverity::kUndefined if the string could not be parsed.
DiagnosticSeverity ParseDiagnosticSeverity(std::string_view str);

constexpr const char* kDiagnosticSeverityStrings[] = {
    "error",
    "info",
    "off",
    "warning",
};

/// Convert a DiagnosticSeverity to the corresponding diag::Severity.
diag::Severity ToSeverity(DiagnosticSeverity sc);

/// DiagnosticRuleSeverities is a map from diagnostic rule to diagnostic severity.
using DiagnosticRuleSeverities = std::unordered_map<DiagnosticRule, DiagnosticSeverity>;

}  // namespace tint::wgsl

#endif  // SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
