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