16c71b0f9SWilly Tu // Copyright 2022 Google LLC
26c71b0f9SWilly Tu //
36c71b0f9SWilly Tu // Licensed under the Apache License, Version 2.0 (the "License");
46c71b0f9SWilly Tu // you may not use this file except in compliance with the License.
56c71b0f9SWilly Tu // You may obtain a copy of the License at
66c71b0f9SWilly Tu //
76c71b0f9SWilly Tu // http://www.apache.org/licenses/LICENSE-2.0
86c71b0f9SWilly Tu //
96c71b0f9SWilly Tu // Unless required by applicable law or agreed to in writing, software
106c71b0f9SWilly Tu // distributed under the License is distributed on an "AS IS" BASIS,
116c71b0f9SWilly Tu // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126c71b0f9SWilly Tu // See the License for the specific language governing permissions and
136c71b0f9SWilly Tu // limitations under the License.
146c71b0f9SWilly Tu #include "config.h"
156c71b0f9SWilly Tu
166c71b0f9SWilly Tu #include "bifurcation.hpp"
176c71b0f9SWilly Tu
18444b5ea4SPatrick Williams #include <nlohmann/json.hpp>
19*c5b55232SWilly Tu #include <stdplus/print.hpp>
20444b5ea4SPatrick Williams
216c71b0f9SWilly Tu #include <charconv>
226c71b0f9SWilly Tu #include <filesystem>
236c71b0f9SWilly Tu #include <fstream>
246c71b0f9SWilly Tu #include <optional>
256c71b0f9SWilly Tu #include <string_view>
266c71b0f9SWilly Tu #include <vector>
276c71b0f9SWilly Tu
286c71b0f9SWilly Tu namespace google
296c71b0f9SWilly Tu {
306c71b0f9SWilly Tu namespace ipmi
316c71b0f9SWilly Tu {
326c71b0f9SWilly Tu
BifurcationStatic()336c71b0f9SWilly Tu BifurcationStatic::BifurcationStatic() :
346c71b0f9SWilly Tu BifurcationStatic(STATIC_BIFURCATION_CONFIG)
35444b5ea4SPatrick Williams {}
366c71b0f9SWilly Tu
BifurcationStatic(std::string_view bifurcationFile)376c71b0f9SWilly Tu BifurcationStatic::BifurcationStatic(std::string_view bifurcationFile) :
386c71b0f9SWilly Tu bifurcationFile(bifurcationFile)
39444b5ea4SPatrick Williams {}
406c71b0f9SWilly Tu
416c71b0f9SWilly Tu std::optional<std::vector<uint8_t>>
getBifurcation(uint8_t index)426c71b0f9SWilly Tu BifurcationStatic::getBifurcation(uint8_t index) noexcept
436c71b0f9SWilly Tu {
446c71b0f9SWilly Tu // Example valid data:
456c71b0f9SWilly Tu // {
466c71b0f9SWilly Tu // "1": [8,8],
476c71b0f9SWilly Tu // "2": [4, 4, 12]
486c71b0f9SWilly Tu // }
496c71b0f9SWilly Tu std::ifstream jsonFile(bifurcationFile.c_str());
506c71b0f9SWilly Tu if (!jsonFile.is_open())
516c71b0f9SWilly Tu {
52*c5b55232SWilly Tu stdplus::print(stderr, "Unable to open file {} for bifurcation.\n",
536c71b0f9SWilly Tu bifurcationFile.data());
546c71b0f9SWilly Tu return std::nullopt;
556c71b0f9SWilly Tu }
566c71b0f9SWilly Tu
576c71b0f9SWilly Tu nlohmann::json jsonData;
586c71b0f9SWilly Tu try
596c71b0f9SWilly Tu {
606c71b0f9SWilly Tu jsonData = nlohmann::json::parse(jsonFile, nullptr, false);
616c71b0f9SWilly Tu }
626c71b0f9SWilly Tu catch (const nlohmann::json::parse_error& ex)
636c71b0f9SWilly Tu {
64*c5b55232SWilly Tu stdplus::print(
656c71b0f9SWilly Tu stderr,
666c71b0f9SWilly Tu "Failed to parse the static config. Parse error at byte {}\n",
676c71b0f9SWilly Tu ex.byte);
686c71b0f9SWilly Tu return std::nullopt;
696c71b0f9SWilly Tu }
706c71b0f9SWilly Tu
716c71b0f9SWilly Tu std::vector<uint8_t> vec;
726c71b0f9SWilly Tu try
736c71b0f9SWilly Tu {
746c71b0f9SWilly Tu std::string key = std::to_string(index);
756c71b0f9SWilly Tu auto value = jsonData[key];
766c71b0f9SWilly Tu value.get_to(vec);
776c71b0f9SWilly Tu }
78444b5ea4SPatrick Williams catch (const std::exception& e)
796c71b0f9SWilly Tu {
80*c5b55232SWilly Tu stdplus::print(stderr,
816c71b0f9SWilly Tu "Failed to convert bifurcation value to vec[uin8_t]\n");
826c71b0f9SWilly Tu return std::nullopt;
836c71b0f9SWilly Tu }
846c71b0f9SWilly Tu
856c71b0f9SWilly Tu return vec;
866c71b0f9SWilly Tu }
876c71b0f9SWilly Tu
886c71b0f9SWilly Tu } // namespace ipmi
896c71b0f9SWilly Tu } // namespace google
90