Я использую terraform-plugin-framework
.
Это надуманный пример, но, скажем, у меня есть такой ресурс:
type R struct {
IsAdmin types.Bool `tfsdk:"isAdmin"`
F1 types.String `tfsdk:"f1"`
}
Как определить схему так, чтобы:
а. если IsAdmin
истинно, F1
должна быть пустой строкой
б. если IsAdmin
ложно, F1
не должно быть пустой строкой
Простым способом было бы установить F1
как Optional
в схеме, а затем, скажем, в обработчике Create
выполнить там проверку. Я не думаю, что это правильный путь. Разве функция Schema
не должна этого делать?
Вы можете сделать это с помощью ValidateConfig:
func (_ *RResource) ValidateConfig(ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse) {
// determine input values
var state R
resp.Diagnostics.Append(req.Config.Get(ctx, &state)...)
if resp.Diagnostics.HasError() {
return
}
// return if either field member/attribute is unknown
if state.IsAdmin.IsUnknown() || state.F1.IsUnknown() {
return
}
// validate F1
if state.IsAdmin.ValueBool() && len(state.F1.ValueString()) > 0 {
resp.Diagnostics.AddAttributeError(
path.Root("f1"),
"Invalid Attribute Value",
"Parameter 'f1' cannot be assigned a value if parameter isAdmin is assigned a value of 'true'",
)
} else {
if !state.IsAdmin.ValueBool() && len(state.F1.ValueString()) == 0 {
resp.Diagnostics.AddAttributeError(
path.Root("f1"),
"Invalid Attribute Value",
"Parameter 'f1' must be assigned a value if parameter isAdmin is assigned a value of 'false'",
)
}
}
}
В этом решении предполагается, что схема атрибутов для ресурса соответствует типичному соглашению о нижнем регистре для элементов поля структуры модели данных, поскольку оно не было указано в вопросе.
Обычно было бы проще выполнить проверку нескольких атрибутов ресурсов с помощью валидатора ресурсов , но в вашей ситуации описанное выше будет проще и понятнее.
Извините, мне следовало включить структурные теги. Я отредактировал пост для ясности.
@user219820 user219820 Хорошо, я обновил ответ для тегов, но обратите внимание, что обычное соглашение предназначено для атрибутов TF, а не для верблюда.
Хорошее замечание по поводу змеиного дела.
Это именно то, что я ищу.