1 #pragma once
2 
3 #include <analyzer/resolution.hpp>
4 #include <hei_main.hpp>
5 #include <nlohmann/json.hpp>
6 
7 #include <map>
8 
9 namespace analyzer
10 {
11 /**
12  * @brief Manages the RAS data files and resolves service actions required for
13  *        error signatures.
14  */
15 class RasDataParser
16 {
17   public:
18     /** @brief Default constructor. */
19     RasDataParser()
20     {
21         initDataFiles();
22     }
23 
24     /** Define all RAS data flags that may be associated with a signature */
25     enum RasDataFlags
26     {
27         SUE_SOURCE,
28         SUE_SEEN,
29         CS_POSSIBLE,
30         RECOVERED_ERROR,
31         INFORMATIONAL_ONLY,
32         MNFG_INFORMATIONAL_ONLY,
33         MASK_BUT_DONT_CLEAR,
34         CRC_RELATED_ERR,
35         CRC_ROOT_CAUSE,
36         ODP_DATA_CORRUPT_SIDE_EFFECT,
37         ODP_DATA_CORRUPT_ROOT_CAUSE,
38     };
39 
40   private:
41     /** @brief The RAS data files. */
42     std::map<libhei::ChipType_t, nlohmann::json> iv_dataFiles;
43 
44   public:
45     /**
46      * @brief Returns a resolution for all the RAS actions needed for the given
47      *        signature.
48      * @param i_signature The target error signature.
49      */
50     std::shared_ptr<Resolution>
51         getResolution(const libhei::Signature& i_signature);
52 
53     /**
54      * @brief Initializes the signature list within the input isolation data
55      *        with their appropriate flags based on the RAS data files.
56      * @param i_signature The target error signature.
57      * @param i_flag      The flag to check for
58      * @return True if the flag is set for the given signature, else false.
59      */
60     bool isFlagSet(const libhei::Signature& i_signature,
61                    const RasDataFlags i_flag) const;
62 
63     /**
64      * @brief Returns of the version of the relevant RAS data file for the
65      *        input signature.
66      * @param i_signature The target error signature.
67      * @return The version of the RAS data file.
68      */
69     unsigned int getVersion(const libhei::Signature& i_signature) const;
70 
71   private:
72     /**
73      * @brief Parses all of the RAS data JSON files and validates them against
74      *        the associated schema.
75      */
76     void initDataFiles();
77 
78     /**
79      * @brief  Parses a signature in the given data file and returns a string
80      *         representing the target action for the signature.
81      * @param  i_data      The parsed RAS data file associated with the
82      *                     signature's chip type.
83      * @param  i_signature The target signature.
84      * @return A string representing the target action for the signature.
85      */
86     std::string parseSignature(const nlohmann::json& i_data,
87                                const libhei::Signature& i_signature) const;
88 
89     /**
90      * @brief  Parses a bus object in the given data file and returns the bus
91      *         type and unit path.
92      * @param  i_data The parsed RAS data file associated with the signature's
93      *                chip type.
94      * @param  i_name The name of the target bus.
95      * @return A tuple containing the bus type and unit path.
96      */
97     std::tuple<callout::BusType, std::string>
98         parseBus(const nlohmann::json& i_data, const std::string& i_name);
99 
100     /**
101      * @brief  Parses an action in the given data file and returns the
102      *         corresponding resolution.
103      * @param  i_data   The parsed RAS data file associated with the signature's
104      *                  chip type.
105      * @param  i_action The target action to parse from the given RAS data.
106      * @return A resolution (or nested resolutions) representing the given
107      *         action.
108      * @note   This function is called recursively because an action could
109      *         reference another action. This function will maintain a stack of
110      *         parsed actions and will assert that the same action cannot be
111      *         parsed more than once in the recursion stack.
112      */
113     std::shared_ptr<Resolution> parseAction(const nlohmann::json& i_data,
114                                             const std::string& i_action);
115 
116     /**
117      * @brief  Returns a callout priority enum value for the given string.
118      * @param  i_priority The priority string.
119      * @return A callout priority enum value.
120      */
121     callout::Priority getPriority(const std::string& i_priority);
122 };
123 
124 } // namespace analyzer
125