// Generated by Create API
// https://github.com/CreateAPI/CreateAPI

import Foundation

public struct StatsigExperimentRequest: Codable, Equatable {
    public var layerName: String
    public var parameterDefault: ParameterDefault?
    public var parameterName: String
    public var parameterType: ParameterType?

    public struct ParameterDefault: Codable, Equatable {
        public var string: String?
        public var bool: Bool?
        public var int: Int?
        public var double: Double?
        public var anyJSONs: [AnyJSON]?
        public var object: [String: AnyJSON]?

        public init(string: String? = nil, bool: Bool? = nil, int: Int? = nil, double: Double? = nil, anyJSONs: [AnyJSON]? = nil, object: [String: AnyJSON]? = nil) {
            self.string = string
            self.bool = bool
            self.int = int
            self.double = double
            self.anyJSONs = anyJSONs
            self.object = object
        }

        public init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            self.string = try? container.decode(String.self)
            self.bool = try? container.decode(Bool.self)
            self.int = try? container.decode(Int.self)
            self.double = try? container.decode(Double.self)
            self.anyJSONs = try? container.decode([AnyJSON].self)
            self.object = try? container.decode([String: AnyJSON].self)
        }

        public func encode(to encoder: Encoder) throws {
            var container = encoder.singleValueContainer()
            if let value = string { try container.encode(value) }
            if let value = bool { try container.encode(value) }
            if let value = int { try container.encode(value) }
            if let value = double { try container.encode(value) }
            if let value = anyJSONs { try container.encode(value) }
            if let value = object { try container.encode(value) }
        }
    }

    public struct ParameterType: RawRepresentable, Codable, Equatable {
        public let rawValue: String

        public init(rawValue: String) {
            self.rawValue = rawValue
        }

        public static let string = Self(rawValue: "string")
        public static let boolean = Self(rawValue: "boolean")
        public static let integer = Self(rawValue: "integer")
        public static let float = Self(rawValue: "float")
        public static let array = Self(rawValue: "array")
        public static let object = Self(rawValue: "object")
    }

    public init(layerName: String, parameterDefault: ParameterDefault? = nil, parameterName: String, parameterType: ParameterType? = nil) {
        self.layerName = layerName
        self.parameterDefault = parameterDefault
        self.parameterName = parameterName
        self.parameterType = parameterType
    }
}
