| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- #pragma once
 
- #include <iostream>
 
- #include <map>
 
- #include <memory>
 
- #include <string>
 
- #include <variant>
 
- #include <vector>
 
- namespace bell {
 
- class TransformConfig {
 
-  protected:
 
-   int invalidInt = -0x7C;
 
-   std::string invalidString = "_invalid";
 
-  public:
 
-   TransformConfig() = default;
 
-   virtual ~TransformConfig() = default;
 
-   int currentVolume = 60;
 
-   virtual std::string rawGetString(const std::string& field) = 0;
 
-   virtual int rawGetInt(const std::string& field) = 0;
 
-   virtual bool isArray(const std::string& field) = 0;
 
-   virtual float rawGetFloat(const std::string& field) = 0;
 
-   virtual std::vector<float> rawGetFloatArray(const std::string& field) = 0;
 
-   virtual std::vector<int> rawGetIntArray(const std::string& field) = 0;
 
-   typedef std::variant<int, float, std::string> Value;
 
-   std::map<std::string, std::vector<Value>> rawValues;
 
-   Value getRawValue(const std::string& field) {
 
-     int index = this->currentVolume * (rawValues[field].size()) / 100;
 
-     if (index >= rawValues[field].size())
 
-       index = rawValues[field].size() - 1;
 
-     return rawValues[field][index];
 
-   }
 
-   std::string getString(const std::string& field, bool isRequired = false,
 
-                         std::string defaultValue = "") {
 
-     if (rawValues.count(field) == 0) {
 
-       rawValues[field] = std::vector<Value>({Value(rawGetString(field))});
 
-     }
 
-     auto val = std::get<std::string>(getRawValue(field));
 
-     if (val == invalidString) {
 
-       if (isRequired)
 
-         throw std::invalid_argument("Field " + field + " is required");
 
-       else
 
-         return defaultValue;
 
-     } else
 
-       return val;
 
-   }
 
-   int getInt(const std::string& field, bool isRequired = false,
 
-              int defaultValue = 0) {
 
-     if (rawValues.count(field) == 0) {
 
-       if (isArray(field)) {
 
-         rawValues[field] = std::vector<Value>();
 
-         for (auto f : rawGetIntArray(field)) {
 
-           rawValues[field].push_back(f);
 
-         }
 
-       } else {
 
-         rawValues[field] = std::vector<Value>({Value(rawGetInt(field))});
 
-       }
 
-     }
 
-     auto val = std::get<int>(getRawValue(field));
 
-     if (val == invalidInt) {
 
-       if (isRequired)
 
-         throw std::invalid_argument("Field " + field + " is required");
 
-       else
 
-         return defaultValue;
 
-     } else
 
-       return val;
 
-   }
 
-   float getFloat(const std::string& field, bool isRequired = false,
 
-                  float defaultValue = 0) {
 
-     if (rawValues.count(field) == 0) {
 
-       if (isArray(field)) {
 
-         rawValues[field] = std::vector<Value>();
 
-         for (auto f : rawGetFloatArray(field)) {
 
-           rawValues[field].push_back(f);
 
-         }
 
-       } else {
 
-         rawValues[field] = std::vector<Value>({Value(rawGetFloat(field))});
 
-       }
 
-     }
 
-     auto val = std::get<float>(getRawValue(field));
 
-     if (val == invalidInt) {
 
-       if (isRequired)
 
-         throw std::invalid_argument("Field " + field + " is required");
 
-       else
 
-         return defaultValue;
 
-     } else
 
-       return val;
 
-   }
 
-   std::vector<int> getChannels() {
 
-     auto channel = getInt("channel", false, invalidInt);
 
-     if (channel != invalidInt) {
 
-       return std::vector<int>({channel});
 
-     }
 
-     return rawGetIntArray("channels");
 
-   }
 
- };
 
- }  // namespace bell
 
 
  |