1 // Copyright 2022 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 #include "config.h" 15 16 #include "bifurcation.hpp" 17 18 #include <fmt/format.h> 19 20 #include <nlohmann/json.hpp> 21 22 #include <charconv> 23 #include <filesystem> 24 #include <fstream> 25 #include <optional> 26 #include <string_view> 27 #include <vector> 28 29 namespace google 30 { 31 namespace ipmi 32 { 33 34 BifurcationStatic::BifurcationStatic() : 35 BifurcationStatic(STATIC_BIFURCATION_CONFIG) 36 {} 37 38 BifurcationStatic::BifurcationStatic(std::string_view bifurcationFile) : 39 bifurcationFile(bifurcationFile) 40 {} 41 42 std::optional<std::vector<uint8_t>> 43 BifurcationStatic::getBifurcation(uint8_t index) noexcept 44 { 45 // Example valid data: 46 // { 47 // "1": [8,8], 48 // "2": [4, 4, 12] 49 // } 50 std::ifstream jsonFile(bifurcationFile.c_str()); 51 if (!jsonFile.is_open()) 52 { 53 fmt::print(stderr, "Unable to open file {} for bifurcation.\n", 54 bifurcationFile.data()); 55 return std::nullopt; 56 } 57 58 nlohmann::json jsonData; 59 try 60 { 61 jsonData = nlohmann::json::parse(jsonFile, nullptr, false); 62 } 63 catch (const nlohmann::json::parse_error& ex) 64 { 65 fmt::print( 66 stderr, 67 "Failed to parse the static config. Parse error at byte {}\n", 68 ex.byte); 69 return std::nullopt; 70 } 71 72 std::vector<uint8_t> vec; 73 try 74 { 75 std::string key = std::to_string(index); 76 auto value = jsonData[key]; 77 value.get_to(vec); 78 } 79 catch (const std::exception& e) 80 { 81 fmt::print(stderr, 82 "Failed to convert bifurcation value to vec[uin8_t]\n"); 83 return std::nullopt; 84 } 85 86 return vec; 87 } 88 89 } // namespace ipmi 90 } // namespace google 91