1a7dea167SDimitry Andric //== Yaml.h ---------------------------------------------------- -*- C++ -*--=// 2a7dea167SDimitry Andric // 3a7dea167SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a7dea167SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5a7dea167SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a7dea167SDimitry Andric // 7a7dea167SDimitry Andric //===----------------------------------------------------------------------===// 8a7dea167SDimitry Andric // 9a7dea167SDimitry Andric // This file defines convenience functions for handling YAML configuration files 10a7dea167SDimitry Andric // for checkers/packages. 11a7dea167SDimitry Andric // 12a7dea167SDimitry Andric //===----------------------------------------------------------------------===// 13a7dea167SDimitry Andric 14a7dea167SDimitry Andric #ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKER_YAML_H 15a7dea167SDimitry Andric #define LLVM_CLANG_LIB_STATICANALYZER_CHECKER_YAML_H 16a7dea167SDimitry Andric 17a7dea167SDimitry Andric #include "clang/StaticAnalyzer/Core/CheckerManager.h" 185ffd83dbSDimitry Andric #include "llvm/Support/VirtualFileSystem.h" 19a7dea167SDimitry Andric #include "llvm/Support/YAMLTraits.h" 20bdd1243dSDimitry Andric #include <optional> 21a7dea167SDimitry Andric 22a7dea167SDimitry Andric namespace clang { 23a7dea167SDimitry Andric namespace ento { 24a7dea167SDimitry Andric 25a7dea167SDimitry Andric /// Read the given file from the filesystem and parse it as a yaml file. The 26a7dea167SDimitry Andric /// template parameter must have a yaml MappingTraits. 27a7dea167SDimitry Andric /// Emit diagnostic error in case of any failure. 28a7dea167SDimitry Andric template <class T, class Checker> 29bdd1243dSDimitry Andric std::optional<T> getConfiguration(CheckerManager &Mgr, Checker *Chk, 30a7dea167SDimitry Andric StringRef Option, StringRef ConfigFile) { 31a7dea167SDimitry Andric if (ConfigFile.trim().empty()) 32bdd1243dSDimitry Andric return std::nullopt; 33a7dea167SDimitry Andric 34a7dea167SDimitry Andric llvm::vfs::FileSystem *FS = llvm::vfs::getRealFileSystem().get(); 35a7dea167SDimitry Andric llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = 36a7dea167SDimitry Andric FS->getBufferForFile(ConfigFile.str()); 37a7dea167SDimitry Andric 38*5f757f3fSDimitry Andric if (Buffer.getError()) { 39a7dea167SDimitry Andric Mgr.reportInvalidCheckerOptionValue(Chk, Option, 40a7dea167SDimitry Andric "a valid filename instead of '" + 41a7dea167SDimitry Andric std::string(ConfigFile) + "'"); 42bdd1243dSDimitry Andric return std::nullopt; 43a7dea167SDimitry Andric } 44a7dea167SDimitry Andric 45a7dea167SDimitry Andric llvm::yaml::Input Input(Buffer.get()->getBuffer()); 46a7dea167SDimitry Andric T Config; 47a7dea167SDimitry Andric Input >> Config; 48a7dea167SDimitry Andric 49a7dea167SDimitry Andric if (std::error_code ec = Input.error()) { 50a7dea167SDimitry Andric Mgr.reportInvalidCheckerOptionValue(Chk, Option, 51a7dea167SDimitry Andric "a valid yaml file: " + ec.message()); 52bdd1243dSDimitry Andric return std::nullopt; 53a7dea167SDimitry Andric } 54a7dea167SDimitry Andric 55a7dea167SDimitry Andric return Config; 56a7dea167SDimitry Andric } 57a7dea167SDimitry Andric 58a7dea167SDimitry Andric } // namespace ento 59a7dea167SDimitry Andric } // namespace clang 60a7dea167SDimitry Andric 6104eeddc0SDimitry Andric #endif // LLVM_CLANG_LIB_STATICANALYZER_CHECKER_YAML_H 62