// 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/builtin/diagnostic_rule.h.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#ifndef SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_
#define SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_

#include <string>
#include <variant>

#include "src/tint/utils/string_stream.h"

namespace tint::builtin {

/// WGSL core diagnostic rules.
enum class CoreDiagnosticRule {
    kUndefined,
    kDerivativeUniformity,
};

/// @param out the stream to write to
/// @param value the CoreDiagnosticRule
/// @returns `out` so calls can be chained
utils::StringStream& operator<<(utils::StringStream& out, CoreDiagnosticRule value);

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

constexpr const char* kCoreDiagnosticRuleStrings[] = {
    "derivative_uniformity",
};

/// Chromium-specific diagnostic rules.
enum class ChromiumDiagnosticRule {
    kUndefined,
    kUnreachableCode,
};

/// @param out the stream to write to
/// @param value the ChromiumDiagnosticRule
/// @returns `out` so calls can be chained
utils::StringStream& operator<<(utils::StringStream& out, ChromiumDiagnosticRule value);

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

constexpr const char* kChromiumDiagnosticRuleStrings[] = {
    "unreachable_code",
};

/// All diagnostic rules understood by Tint.
using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;

}  // namespace tint::builtin

#endif  // SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_
