/*
 Copyright 2019 Alain Dargelas
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/* 
 * File:   Waiver.h
 * Author: alain
 *
 * Created on May 7, 2017, 11:11 PM
 */

#ifndef WAIVER_H
#define WAIVER_H

#include <string>
#include <set>
#include <vector>
#include <map>
#include "ErrorDefinition.h"

namespace SURELOG {

class Waiver {
public:
    Waiver();
    Waiver(const Waiver& orig);
    virtual ~Waiver();
    
    static void initWaivers();
    
    static bool macroArgCheck(std::string name);
    
    static void setWaiver(std::string messageId, std::string fileName, unsigned int line, std::string objectName);

    
    class WaiverData {
    public:
        WaiverData(ErrorDefinition::ErrorType messageId, std::string fileName, unsigned int line, std::string objectName) 
         : m_messageId(messageId), m_fileName(fileName), m_line(line), m_objectId(objectName) {}
        ErrorDefinition::ErrorType m_messageId;
        std::string  m_fileName;
        unsigned int m_line;
        std::string  m_objectId;
    };

    static std::multimap<ErrorDefinition::ErrorType, WaiverData>& getWaivers() { return m_waivers; }
    
private:
    static std::set<std::string> m_macroArgCheck;
    static std::multimap<ErrorDefinition::ErrorType, WaiverData> m_waivers;

};

};

#endif /* WAIVER_H */



