ComplianceRule.java
package com.cloudforgeci.api.core.rules;
import java.util.Optional;
/**
* Represents a compliance rule with its validation status and AWS Config rule mapping.
*
* <p>This structured approach links compliance validation to actual AWS Config rules,
* providing traceability between framework requirements and infrastructure monitoring.</p>
*
* @param ruleId Unique identifier for this compliance rule (e.g., "SOC2-CC6.1", "PCI-DSS-Req3.4")
* @param description Human-readable description of the requirement
* @param configRuleId Optional AWS Config rule ID that monitors this requirement
* @param passed Whether the validation check passed
* @param errorMessage Optional error message if validation failed
*/
public record ComplianceRule(
String ruleId,
String description,
Optional<String> configRuleId,
boolean passed,
Optional<String> errorMessage
) {
/**
* Create a passing compliance rule.
*/
public static ComplianceRule pass(String ruleId, String description, String configRuleId) {
return new ComplianceRule(
ruleId,
description,
Optional.ofNullable(configRuleId),
true,
Optional.empty()
);
}
/**
* Create a passing compliance rule without Config rule mapping.
*/
public static ComplianceRule pass(String ruleId, String description) {
return new ComplianceRule(
ruleId,
description,
Optional.empty(),
true,
Optional.empty()
);
}
/**
* Create a failing compliance rule with error message.
*/
public static ComplianceRule fail(String ruleId, String description, String errorMessage) {
return new ComplianceRule(
ruleId,
description,
Optional.empty(),
false,
Optional.of(errorMessage)
);
}
/**
* Create a failing compliance rule with Config rule mapping.
*/
public static ComplianceRule fail(String ruleId, String description, String configRuleId, String errorMessage) {
return new ComplianceRule(
ruleId,
description,
Optional.ofNullable(configRuleId),
false,
Optional.of(errorMessage)
);
}
/**
* Convert to legacy string error format for CDK validation.
*/
public Optional<String> toErrorString() {
if (passed) {
return Optional.empty();
}
StringBuilder error = new StringBuilder();
error.append(ruleId).append(": ").append(description);
errorMessage.ifPresent(msg -> error.append(" - ").append(msg));
configRuleId.ifPresent(id -> error.append(" (Config Rule: ").append(id).append(")"));
return Optional.of(error.toString());
}
}