blob: b0883d633f9cc66901619027b1b150c183282ef1 [file] [edit]
#pragma once
#include <cstddef>
#include <string>
#include <vector>
#include <cm/optional>
#include <cm3p/json/value.h>
/// @brief Objects for building serializable SARIF logs
namespace cmSarif {
/// @brief The severity level of a result in SARIF
///
/// The SARIF specification section 3.27.10 defines four levels of severity
/// for results. It is a string property of a result rather than its own type.
enum class ResultSeverityLevel
{
Warning,
Error,
Note,
None,
};
Json::Value GetJson(ResultSeverityLevel level);
/// @brief SARIF artifactLocation object (§3.4)
struct ArtifactLocation
{
std::string Uri;
std::string UriBaseId;
};
Json::Value GetJson(ArtifactLocation const& artifactLocation);
/// @brief SARIF region object (§3.30)
struct Region
{
long StartLine;
};
Json::Value GetJson(Region region);
/// @brief SARIF physicalLocation object (§3.29)
struct PhysicalLocation
{
ArtifactLocation Artifact;
cm::optional<Region> ArtifactRegion;
};
Json::Value GetJson(PhysicalLocation const& physicalLocation);
/// @brief SARIF location object (§3.28)
struct Location
{
PhysicalLocation Physical;
};
Json::Value GetJson(Location const& location);
/// @brief A result reported by a run of a static analysis tool
///
/// This is the data model for results in a SARIF log. Typically, a result only
/// requires either a message or a rule index.
struct Result
{
/// @brief The message text of the result (required if no rule index)
cm::optional<std::string> Message;
/// @brief The location of the result (optional)
cm::optional<cmSarif::Location> Location;
/// @brief The severity level of the result (optional)
cm::optional<cmSarif::ResultSeverityLevel> Level;
/// @brief The rule ID of the result (optional)
cm::optional<std::string> RuleId;
/// @brief The index of the rule in the log's rule array (optional)
cm::optional<std::size_t> RuleIndex;
};
Json::Value GetJson(Result const& result);
/// @brief A reporting descriptor provides information about an analysis result
///
/// Reporting descriptors (SARIF specification section 3.49) provide
/// information about categories of reporting items and is used to define
/// rules and taxa.
struct ReportingDescriptor
{
std::string Id;
cm::optional<std::string> Name;
};
Json::Value GetJson(ReportingDescriptor const& reportingDescriptor);
struct ToolComponent
{
std::string Name;
std::string Version;
std::vector<ReportingDescriptor> Rules;
};
Json::Value GetJson(ToolComponent const& toolComponent);
struct Tool
{
ToolComponent Driver;
};
Json::Value GetJson(Tool const& tool);
struct Run
{
cmSarif::Tool Tool;
std::vector<Result> Results;
};
Json::Value GetJson(Run const& run);
bool WriteLog(std::string const& path, cmSarif::Run const& run);
} // namespace cmSarif