The link you supplied uses the following semantic equality check:
// CustomStringValue defined in the value type section
// Ensure the implementation satisfies the expected interfaces
var _ basetypes.StringValuableWithSemanticEquals = CustomStringValue{}
func (v CustomStringValue) StringSemanticEquals(ctx context.Context, newValuable basetypes.StringValuable) (bool, diag.Diagnostics) {
var diags diag.Diagnostics
// The framework should always pass the correct value type, but always check
newValue, ok := newValuable.(CustomStringValue)
if !ok {
diags.AddError(
"Semantic Equality Check Error",
"An unexpected value type was received while performing semantic equality checks. "+
"Please report this to the provider developers.\n\n"+
"Expected Value Type: "+fmt.Sprintf("%T", v)+"\n"+
"Got Value Type: "+fmt.Sprintf("%T", newValuable),
)
return false, diags
}
// Skipping error checking if CustomStringValue already implemented RFC3339 validation
priorTime, _ := time.Parse(time.RFC3339, v.StringValue.ValueString())
// Skipping error checking if CustomStringValue already implemented RFC3339 validation
newTime, _ := time.Parse(time.RFC3339, newValue.ValueString())
// If the times are equivalent, keep the prior value
return priorTime.Equal(newTime), diags
}
The StringSemanticEquals
method is defined on CustomStringValue
which will always represent the oldValue
. Because of the way in which semantic equality checks are implemented on custom types, semantic equality checking will always be oldValue.SemanticEquals(ctx, newValue)
.