// generated from terraform resource schema
import * as cdktf from 'cdktf';
export function networkfirewallRuleGroupRuleGroupRuleVariablesIpSetsIpSetToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        definition: cdktf.listMapper(cdktf.stringToTerraform)(struct.definition),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRuleVariablesIpSetsIpSetOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._definition !== undefined) {
            hasAnyValues = true;
            internalValueResult.definition = this._definition;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._definition = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._definition = value.definition;
        }
    }
    // definition - computed: false, optional: false, required: true
    _definition;
    get definition() {
        return cdktf.Fn.tolist(this.getListAttribute('definition'));
    }
    set definition(value) {
        this._definition = value;
    }
    // Temporarily expose input value. Use with caution.
    get definitionInput() {
        return this._definition;
    }
}
export function networkfirewallRuleGroupRuleGroupRuleVariablesIpSetsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        key: cdktf.stringToTerraform(struct.key),
        ip_set: networkfirewallRuleGroupRuleGroupRuleVariablesIpSetsIpSetToTerraform(struct.ipSet),
    };
}
export function networkfirewallRuleGroupRuleGroupRuleVariablesPortSetsPortSetToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        definition: cdktf.listMapper(cdktf.stringToTerraform)(struct.definition),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRuleVariablesPortSetsPortSetOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._definition !== undefined) {
            hasAnyValues = true;
            internalValueResult.definition = this._definition;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._definition = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._definition = value.definition;
        }
    }
    // definition - computed: false, optional: false, required: true
    _definition;
    get definition() {
        return cdktf.Fn.tolist(this.getListAttribute('definition'));
    }
    set definition(value) {
        this._definition = value;
    }
    // Temporarily expose input value. Use with caution.
    get definitionInput() {
        return this._definition;
    }
}
export function networkfirewallRuleGroupRuleGroupRuleVariablesPortSetsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        key: cdktf.stringToTerraform(struct.key),
        port_set: networkfirewallRuleGroupRuleGroupRuleVariablesPortSetsPortSetToTerraform(struct.portSet),
    };
}
export function networkfirewallRuleGroupRuleGroupRuleVariablesToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        ip_sets: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRuleVariablesIpSetsToTerraform)(struct.ipSets),
        port_sets: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRuleVariablesPortSetsToTerraform)(struct.portSets),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRuleVariablesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ipSets !== undefined) {
            hasAnyValues = true;
            internalValueResult.ipSets = this._ipSets;
        }
        if (this._portSets !== undefined) {
            hasAnyValues = true;
            internalValueResult.portSets = this._portSets;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ipSets = undefined;
            this._portSets = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ipSets = value.ipSets;
            this._portSets = value.portSets;
        }
    }
    // ip_sets - computed: false, optional: true, required: false
    _ipSets;
    get ipSets() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('ip_sets')));
    }
    set ipSets(value) {
        this._ipSets = value;
    }
    resetIpSets() {
        this._ipSets = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ipSetsInput() {
        return this._ipSets;
    }
    // port_sets - computed: false, optional: true, required: false
    _portSets;
    get portSets() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('port_sets')));
    }
    set portSets(value) {
        this._portSets = value;
    }
    resetPortSets() {
        this._portSets = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get portSetsInput() {
        return this._portSets;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceRulesSourceListToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        generated_rules_type: cdktf.stringToTerraform(struct.generatedRulesType),
        target_types: cdktf.listMapper(cdktf.stringToTerraform)(struct.targetTypes),
        targets: cdktf.listMapper(cdktf.stringToTerraform)(struct.targets),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceRulesSourceListOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._generatedRulesType !== undefined) {
            hasAnyValues = true;
            internalValueResult.generatedRulesType = this._generatedRulesType;
        }
        if (this._targetTypes !== undefined) {
            hasAnyValues = true;
            internalValueResult.targetTypes = this._targetTypes;
        }
        if (this._targets !== undefined) {
            hasAnyValues = true;
            internalValueResult.targets = this._targets;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._generatedRulesType = undefined;
            this._targetTypes = undefined;
            this._targets = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._generatedRulesType = value.generatedRulesType;
            this._targetTypes = value.targetTypes;
            this._targets = value.targets;
        }
    }
    // generated_rules_type - computed: false, optional: false, required: true
    _generatedRulesType;
    get generatedRulesType() {
        return this.getStringAttribute('generated_rules_type');
    }
    set generatedRulesType(value) {
        this._generatedRulesType = value;
    }
    // Temporarily expose input value. Use with caution.
    get generatedRulesTypeInput() {
        return this._generatedRulesType;
    }
    // target_types - computed: false, optional: false, required: true
    _targetTypes;
    get targetTypes() {
        return cdktf.Fn.tolist(this.getListAttribute('target_types'));
    }
    set targetTypes(value) {
        this._targetTypes = value;
    }
    // Temporarily expose input value. Use with caution.
    get targetTypesInput() {
        return this._targetTypes;
    }
    // targets - computed: false, optional: false, required: true
    _targets;
    get targets() {
        return cdktf.Fn.tolist(this.getListAttribute('targets'));
    }
    set targets(value) {
        this._targets = value;
    }
    // Temporarily expose input value. Use with caution.
    get targetsInput() {
        return this._targets;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleHeaderToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        destination: cdktf.stringToTerraform(struct.destination),
        destination_port: cdktf.stringToTerraform(struct.destinationPort),
        direction: cdktf.stringToTerraform(struct.direction),
        protocol: cdktf.stringToTerraform(struct.protocol),
        source: cdktf.stringToTerraform(struct.source),
        source_port: cdktf.stringToTerraform(struct.sourcePort),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleHeaderOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._destination !== undefined) {
            hasAnyValues = true;
            internalValueResult.destination = this._destination;
        }
        if (this._destinationPort !== undefined) {
            hasAnyValues = true;
            internalValueResult.destinationPort = this._destinationPort;
        }
        if (this._direction !== undefined) {
            hasAnyValues = true;
            internalValueResult.direction = this._direction;
        }
        if (this._protocol !== undefined) {
            hasAnyValues = true;
            internalValueResult.protocol = this._protocol;
        }
        if (this._source !== undefined) {
            hasAnyValues = true;
            internalValueResult.source = this._source;
        }
        if (this._sourcePort !== undefined) {
            hasAnyValues = true;
            internalValueResult.sourcePort = this._sourcePort;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._destination = undefined;
            this._destinationPort = undefined;
            this._direction = undefined;
            this._protocol = undefined;
            this._source = undefined;
            this._sourcePort = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._destination = value.destination;
            this._destinationPort = value.destinationPort;
            this._direction = value.direction;
            this._protocol = value.protocol;
            this._source = value.source;
            this._sourcePort = value.sourcePort;
        }
    }
    // destination - computed: false, optional: false, required: true
    _destination;
    get destination() {
        return this.getStringAttribute('destination');
    }
    set destination(value) {
        this._destination = value;
    }
    // Temporarily expose input value. Use with caution.
    get destinationInput() {
        return this._destination;
    }
    // destination_port - computed: false, optional: false, required: true
    _destinationPort;
    get destinationPort() {
        return this.getStringAttribute('destination_port');
    }
    set destinationPort(value) {
        this._destinationPort = value;
    }
    // Temporarily expose input value. Use with caution.
    get destinationPortInput() {
        return this._destinationPort;
    }
    // direction - computed: false, optional: false, required: true
    _direction;
    get direction() {
        return this.getStringAttribute('direction');
    }
    set direction(value) {
        this._direction = value;
    }
    // Temporarily expose input value. Use with caution.
    get directionInput() {
        return this._direction;
    }
    // protocol - computed: false, optional: false, required: true
    _protocol;
    get protocol() {
        return this.getStringAttribute('protocol');
    }
    set protocol(value) {
        this._protocol = value;
    }
    // Temporarily expose input value. Use with caution.
    get protocolInput() {
        return this._protocol;
    }
    // source - computed: false, optional: false, required: true
    _source;
    get source() {
        return this.getStringAttribute('source');
    }
    set source(value) {
        this._source = value;
    }
    // Temporarily expose input value. Use with caution.
    get sourceInput() {
        return this._source;
    }
    // source_port - computed: false, optional: false, required: true
    _sourcePort;
    get sourcePort() {
        return this.getStringAttribute('source_port');
    }
    set sourcePort(value) {
        this._sourcePort = value;
    }
    // Temporarily expose input value. Use with caution.
    get sourcePortInput() {
        return this._sourcePort;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleRuleOptionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        keyword: cdktf.stringToTerraform(struct.keyword),
        settings: cdktf.listMapper(cdktf.stringToTerraform)(struct.settings),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        action: cdktf.stringToTerraform(struct.action),
        header: networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleHeaderToTerraform(struct.header),
        rule_option: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleRuleOptionToTerraform)(struct.ruleOption),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionDimensionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        value: cdktf.stringToTerraform(struct.value),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        dimension: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionDimensionToTerraform)(struct.dimension),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._dimension !== undefined) {
            hasAnyValues = true;
            internalValueResult.dimension = this._dimension;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._dimension = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._dimension = value.dimension;
        }
    }
    // dimension - computed: false, optional: false, required: true
    _dimension;
    get dimension() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('dimension')));
    }
    set dimension(value) {
        this._dimension = value;
    }
    // Temporarily expose input value. Use with caution.
    get dimensionInput() {
        return this._dimension;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        publish_metric_action: networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionToTerraform(struct.publishMetricAction),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._publishMetricAction?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.publishMetricAction = this._publishMetricAction?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._publishMetricAction.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._publishMetricAction.internalValue = value.publishMetricAction;
        }
    }
    // publish_metric_action - computed: false, optional: false, required: true
    _publishMetricAction = new NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionPublishMetricActionOutputReference(this, "publish_metric_action", true);
    get publishMetricAction() {
        return this._publishMetricAction;
    }
    putPublishMetricAction(value) {
        this._publishMetricAction.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get publishMetricActionInput() {
        return this._publishMetricAction.internalValue;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        action_name: cdktf.stringToTerraform(struct.actionName),
        action_definition: networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionActionDefinitionToTerraform(struct.actionDefinition),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesDestinationToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        address_definition: cdktf.stringToTerraform(struct.addressDefinition),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesDestinationPortToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        from_port: cdktf.numberToTerraform(struct.fromPort),
        to_port: cdktf.numberToTerraform(struct.toPort),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesSourceToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        address_definition: cdktf.stringToTerraform(struct.addressDefinition),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesSourcePortToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        from_port: cdktf.numberToTerraform(struct.fromPort),
        to_port: cdktf.numberToTerraform(struct.toPort),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesTcpFlagToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        flags: cdktf.listMapper(cdktf.stringToTerraform)(struct.flags),
        masks: cdktf.listMapper(cdktf.stringToTerraform)(struct.masks),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        protocols: cdktf.listMapper(cdktf.numberToTerraform)(struct.protocols),
        destination: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesDestinationToTerraform)(struct.destination),
        destination_port: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesDestinationPortToTerraform)(struct.destinationPort),
        source: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesSourceToTerraform)(struct.source),
        source_port: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesSourcePortToTerraform)(struct.sourcePort),
        tcp_flag: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesTcpFlagToTerraform)(struct.tcpFlag),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._protocols !== undefined) {
            hasAnyValues = true;
            internalValueResult.protocols = this._protocols;
        }
        if (this._destination !== undefined) {
            hasAnyValues = true;
            internalValueResult.destination = this._destination;
        }
        if (this._destinationPort !== undefined) {
            hasAnyValues = true;
            internalValueResult.destinationPort = this._destinationPort;
        }
        if (this._source !== undefined) {
            hasAnyValues = true;
            internalValueResult.source = this._source;
        }
        if (this._sourcePort !== undefined) {
            hasAnyValues = true;
            internalValueResult.sourcePort = this._sourcePort;
        }
        if (this._tcpFlag !== undefined) {
            hasAnyValues = true;
            internalValueResult.tcpFlag = this._tcpFlag;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._protocols = undefined;
            this._destination = undefined;
            this._destinationPort = undefined;
            this._source = undefined;
            this._sourcePort = undefined;
            this._tcpFlag = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._protocols = value.protocols;
            this._destination = value.destination;
            this._destinationPort = value.destinationPort;
            this._source = value.source;
            this._sourcePort = value.sourcePort;
            this._tcpFlag = value.tcpFlag;
        }
    }
    // protocols - computed: false, optional: true, required: false
    _protocols;
    get protocols() {
        return cdktf.Token.asNumberList(cdktf.Fn.tolist(this.getNumberListAttribute('protocols')));
    }
    set protocols(value) {
        this._protocols = value;
    }
    resetProtocols() {
        this._protocols = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get protocolsInput() {
        return this._protocols;
    }
    // destination - computed: false, optional: true, required: false
    _destination;
    get destination() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('destination')));
    }
    set destination(value) {
        this._destination = value;
    }
    resetDestination() {
        this._destination = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get destinationInput() {
        return this._destination;
    }
    // destination_port - computed: false, optional: true, required: false
    _destinationPort;
    get destinationPort() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('destination_port')));
    }
    set destinationPort(value) {
        this._destinationPort = value;
    }
    resetDestinationPort() {
        this._destinationPort = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get destinationPortInput() {
        return this._destinationPort;
    }
    // source - computed: false, optional: true, required: false
    _source;
    get source() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('source')));
    }
    set source(value) {
        this._source = value;
    }
    resetSource() {
        this._source = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sourceInput() {
        return this._source;
    }
    // source_port - computed: false, optional: true, required: false
    _sourcePort;
    get sourcePort() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('source_port')));
    }
    set sourcePort(value) {
        this._sourcePort = value;
    }
    resetSourcePort() {
        this._sourcePort = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sourcePortInput() {
        return this._sourcePort;
    }
    // tcp_flag - computed: false, optional: true, required: false
    _tcpFlag;
    get tcpFlag() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('tcp_flag')));
    }
    set tcpFlag(value) {
        this._tcpFlag = value;
    }
    resetTcpFlag() {
        this._tcpFlag = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tcpFlagInput() {
        return this._tcpFlag;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        actions: cdktf.listMapper(cdktf.stringToTerraform)(struct.actions),
        match_attributes: networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesToTerraform(struct.matchAttributes),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._actions !== undefined) {
            hasAnyValues = true;
            internalValueResult.actions = this._actions;
        }
        if (this._matchAttributes?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.matchAttributes = this._matchAttributes?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._actions = undefined;
            this._matchAttributes.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._actions = value.actions;
            this._matchAttributes.internalValue = value.matchAttributes;
        }
    }
    // actions - computed: false, optional: false, required: true
    _actions;
    get actions() {
        return cdktf.Fn.tolist(this.getListAttribute('actions'));
    }
    set actions(value) {
        this._actions = value;
    }
    // Temporarily expose input value. Use with caution.
    get actionsInput() {
        return this._actions;
    }
    // match_attributes - computed: false, optional: false, required: true
    _matchAttributes = new NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionMatchAttributesOutputReference(this, "match_attributes", true);
    get matchAttributes() {
        return this._matchAttributes;
    }
    putMatchAttributes(value) {
        this._matchAttributes.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get matchAttributesInput() {
        return this._matchAttributes.internalValue;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        priority: cdktf.numberToTerraform(struct.priority),
        rule_definition: networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleRuleDefinitionToTerraform(struct.ruleDefinition),
    };
}
export function networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        custom_action: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsCustomActionToTerraform)(struct.customAction),
        stateless_rule: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsStatelessRuleToTerraform)(struct.statelessRule),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._customAction !== undefined) {
            hasAnyValues = true;
            internalValueResult.customAction = this._customAction;
        }
        if (this._statelessRule !== undefined) {
            hasAnyValues = true;
            internalValueResult.statelessRule = this._statelessRule;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._customAction = undefined;
            this._statelessRule = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._customAction = value.customAction;
            this._statelessRule = value.statelessRule;
        }
    }
    // custom_action - computed: false, optional: true, required: false
    _customAction;
    get customAction() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('custom_action')));
    }
    set customAction(value) {
        this._customAction = value;
    }
    resetCustomAction() {
        this._customAction = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get customActionInput() {
        return this._customAction;
    }
    // stateless_rule - computed: false, optional: false, required: true
    _statelessRule;
    get statelessRule() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('stateless_rule')));
    }
    set statelessRule(value) {
        this._statelessRule = value;
    }
    // Temporarily expose input value. Use with caution.
    get statelessRuleInput() {
        return this._statelessRule;
    }
}
export function networkfirewallRuleGroupRuleGroupRulesSourceToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        rules_string: cdktf.stringToTerraform(struct.rulesString),
        rules_source_list: networkfirewallRuleGroupRuleGroupRulesSourceRulesSourceListToTerraform(struct.rulesSourceList),
        stateful_rule: cdktf.listMapper(networkfirewallRuleGroupRuleGroupRulesSourceStatefulRuleToTerraform)(struct.statefulRule),
        stateless_rules_and_custom_actions: networkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsToTerraform(struct.statelessRulesAndCustomActions),
    };
}
export class NetworkfirewallRuleGroupRuleGroupRulesSourceOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._rulesString !== undefined) {
            hasAnyValues = true;
            internalValueResult.rulesString = this._rulesString;
        }
        if (this._rulesSourceList?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.rulesSourceList = this._rulesSourceList?.internalValue;
        }
        if (this._statefulRule !== undefined) {
            hasAnyValues = true;
            internalValueResult.statefulRule = this._statefulRule;
        }
        if (this._statelessRulesAndCustomActions?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.statelessRulesAndCustomActions = this._statelessRulesAndCustomActions?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._rulesString = undefined;
            this._rulesSourceList.internalValue = undefined;
            this._statefulRule = undefined;
            this._statelessRulesAndCustomActions.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._rulesString = value.rulesString;
            this._rulesSourceList.internalValue = value.rulesSourceList;
            this._statefulRule = value.statefulRule;
            this._statelessRulesAndCustomActions.internalValue = value.statelessRulesAndCustomActions;
        }
    }
    // rules_string - computed: false, optional: true, required: false
    _rulesString;
    get rulesString() {
        return this.getStringAttribute('rules_string');
    }
    set rulesString(value) {
        this._rulesString = value;
    }
    resetRulesString() {
        this._rulesString = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get rulesStringInput() {
        return this._rulesString;
    }
    // rules_source_list - computed: false, optional: true, required: false
    _rulesSourceList = new NetworkfirewallRuleGroupRuleGroupRulesSourceRulesSourceListOutputReference(this, "rules_source_list", true);
    get rulesSourceList() {
        return this._rulesSourceList;
    }
    putRulesSourceList(value) {
        this._rulesSourceList.internalValue = value;
    }
    resetRulesSourceList() {
        this._rulesSourceList.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get rulesSourceListInput() {
        return this._rulesSourceList.internalValue;
    }
    // stateful_rule - computed: false, optional: true, required: false
    _statefulRule;
    get statefulRule() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('stateful_rule')));
    }
    set statefulRule(value) {
        this._statefulRule = value;
    }
    resetStatefulRule() {
        this._statefulRule = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get statefulRuleInput() {
        return this._statefulRule;
    }
    // stateless_rules_and_custom_actions - computed: false, optional: true, required: false
    _statelessRulesAndCustomActions = new NetworkfirewallRuleGroupRuleGroupRulesSourceStatelessRulesAndCustomActionsOutputReference(this, "stateless_rules_and_custom_actions", true);
    get statelessRulesAndCustomActions() {
        return this._statelessRulesAndCustomActions;
    }
    putStatelessRulesAndCustomActions(value) {
        this._statelessRulesAndCustomActions.internalValue = value;
    }
    resetStatelessRulesAndCustomActions() {
        this._statelessRulesAndCustomActions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get statelessRulesAndCustomActionsInput() {
        return this._statelessRulesAndCustomActions.internalValue;
    }
}
export function networkfirewallRuleGroupRuleGroupStatefulRuleOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        rule_order: cdktf.stringToTerraform(struct.ruleOrder),
    };
}
export class NetworkfirewallRuleGroupRuleGroupStatefulRuleOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ruleOrder !== undefined) {
            hasAnyValues = true;
            internalValueResult.ruleOrder = this._ruleOrder;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ruleOrder = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ruleOrder = value.ruleOrder;
        }
    }
    // rule_order - computed: false, optional: false, required: true
    _ruleOrder;
    get ruleOrder() {
        return this.getStringAttribute('rule_order');
    }
    set ruleOrder(value) {
        this._ruleOrder = value;
    }
    // Temporarily expose input value. Use with caution.
    get ruleOrderInput() {
        return this._ruleOrder;
    }
}
export function networkfirewallRuleGroupRuleGroupToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        rule_variables: networkfirewallRuleGroupRuleGroupRuleVariablesToTerraform(struct.ruleVariables),
        rules_source: networkfirewallRuleGroupRuleGroupRulesSourceToTerraform(struct.rulesSource),
        stateful_rule_options: networkfirewallRuleGroupRuleGroupStatefulRuleOptionsToTerraform(struct.statefulRuleOptions),
    };
}
export class NetworkfirewallRuleGroupRuleGroupOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ruleVariables?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.ruleVariables = this._ruleVariables?.internalValue;
        }
        if (this._rulesSource?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.rulesSource = this._rulesSource?.internalValue;
        }
        if (this._statefulRuleOptions?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.statefulRuleOptions = this._statefulRuleOptions?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ruleVariables.internalValue = undefined;
            this._rulesSource.internalValue = undefined;
            this._statefulRuleOptions.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ruleVariables.internalValue = value.ruleVariables;
            this._rulesSource.internalValue = value.rulesSource;
            this._statefulRuleOptions.internalValue = value.statefulRuleOptions;
        }
    }
    // rule_variables - computed: false, optional: true, required: false
    _ruleVariables = new NetworkfirewallRuleGroupRuleGroupRuleVariablesOutputReference(this, "rule_variables", true);
    get ruleVariables() {
        return this._ruleVariables;
    }
    putRuleVariables(value) {
        this._ruleVariables.internalValue = value;
    }
    resetRuleVariables() {
        this._ruleVariables.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ruleVariablesInput() {
        return this._ruleVariables.internalValue;
    }
    // rules_source - computed: false, optional: false, required: true
    _rulesSource = new NetworkfirewallRuleGroupRuleGroupRulesSourceOutputReference(this, "rules_source", true);
    get rulesSource() {
        return this._rulesSource;
    }
    putRulesSource(value) {
        this._rulesSource.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get rulesSourceInput() {
        return this._rulesSource.internalValue;
    }
    // stateful_rule_options - computed: false, optional: true, required: false
    _statefulRuleOptions = new NetworkfirewallRuleGroupRuleGroupStatefulRuleOptionsOutputReference(this, "stateful_rule_options", true);
    get statefulRuleOptions() {
        return this._statefulRuleOptions;
    }
    putStatefulRuleOptions(value) {
        this._statefulRuleOptions.internalValue = value;
    }
    resetStatefulRuleOptions() {
        this._statefulRuleOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get statefulRuleOptionsInput() {
        return this._statefulRuleOptions.internalValue;
    }
}
/**
* Represents a {@link https://www.terraform.io/docs/providers/aws/r/networkfirewall_rule_group aws_networkfirewall_rule_group}
*/
export class NetworkfirewallRuleGroup extends cdktf.TerraformResource {
    // =================
    // STATIC PROPERTIES
    // =================
    static tfResourceType = "aws_networkfirewall_rule_group";
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://www.terraform.io/docs/providers/aws/r/networkfirewall_rule_group aws_networkfirewall_rule_group} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options NetworkfirewallRuleGroupConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'aws_networkfirewall_rule_group',
            terraformGeneratorMetadata: {
                providerName: 'aws'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle
        });
        this._capacity = config.capacity;
        this._description = config.description;
        this._name = config.name;
        this._rules = config.rules;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._type = config.type;
        this._ruleGroup.internalValue = config.ruleGroup;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // capacity - computed: false, optional: false, required: true
    _capacity;
    get capacity() {
        return this.getNumberAttribute('capacity');
    }
    set capacity(value) {
        this._capacity = value;
    }
    // Temporarily expose input value. Use with caution.
    get capacityInput() {
        return this._capacity;
    }
    // description - computed: false, optional: true, required: false
    _description;
    get description() {
        return this.getStringAttribute('description');
    }
    set description(value) {
        this._description = value;
    }
    resetDescription() {
        this._description = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get descriptionInput() {
        return this._description;
    }
    // id - computed: true, optional: true, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    // name - computed: false, optional: false, required: true
    _name;
    get name() {
        return this.getStringAttribute('name');
    }
    set name(value) {
        this._name = value;
    }
    // Temporarily expose input value. Use with caution.
    get nameInput() {
        return this._name;
    }
    // rules - computed: false, optional: true, required: false
    _rules;
    get rules() {
        return this.getStringAttribute('rules');
    }
    set rules(value) {
        this._rules = value;
    }
    resetRules() {
        this._rules = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get rulesInput() {
        return this._rules;
    }
    // tags - computed: false, optional: true, required: false
    _tags;
    get tags() {
        return this.getStringMapAttribute('tags');
    }
    set tags(value) {
        this._tags = value;
    }
    resetTags() {
        this._tags = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsInput() {
        return this._tags;
    }
    // tags_all - computed: true, optional: true, required: false
    _tagsAll;
    get tagsAll() {
        return this.getStringMapAttribute('tags_all');
    }
    set tagsAll(value) {
        this._tagsAll = value;
    }
    resetTagsAll() {
        this._tagsAll = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsAllInput() {
        return this._tagsAll;
    }
    // type - computed: false, optional: false, required: true
    _type;
    get type() {
        return this.getStringAttribute('type');
    }
    set type(value) {
        this._type = value;
    }
    // Temporarily expose input value. Use with caution.
    get typeInput() {
        return this._type;
    }
    // update_token - computed: true, optional: false, required: false
    get updateToken() {
        return this.getStringAttribute('update_token');
    }
    // rule_group - computed: false, optional: true, required: false
    _ruleGroup = new NetworkfirewallRuleGroupRuleGroupOutputReference(this, "rule_group", true);
    get ruleGroup() {
        return this._ruleGroup;
    }
    putRuleGroup(value) {
        this._ruleGroup.internalValue = value;
    }
    resetRuleGroup() {
        this._ruleGroup.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ruleGroupInput() {
        return this._ruleGroup.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            capacity: cdktf.numberToTerraform(this._capacity),
            description: cdktf.stringToTerraform(this._description),
            name: cdktf.stringToTerraform(this._name),
            rules: cdktf.stringToTerraform(this._rules),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            type: cdktf.stringToTerraform(this._type),
            rule_group: networkfirewallRuleGroupRuleGroupToTerraform(this._ruleGroup.internalValue),
        };
    }
}
//# sourceMappingURL=networkfirewall-rule-group.js.map