in internal/elasticsearch/index/index/models.go [309:432]
func (model tfModel) toIndexSettings(ctx context.Context) (map[string]interface{}, diag.Diagnostics) {
settings := map[string]interface{}{}
modelType := reflect.TypeOf(model)
for _, key := range allSettingsKeys {
tfFieldKey := convertSettingsKeyToTFFieldKey(key)
value, ok := model.getFieldValueByTagValue(tfFieldKey, modelType)
if !ok {
return map[string]interface{}{}, diag.Diagnostics{
diag.NewErrorDiagnostic(
"failed to find setting value",
fmt.Sprintf("expected setting with key %s", tfFieldKey),
),
}
}
if !value.IsNull() && !value.IsUnknown() {
var settingsValue interface{}
switch a := value.(type) {
case types.String:
settingsValue = a.ValueString()
case types.Bool:
settingsValue = a.ValueBool()
case types.Int64:
settingsValue = a.ValueInt64()
case types.List:
elemType := a.ElementType(ctx)
if elemType != types.StringType {
return map[string]interface{}{}, diag.Diagnostics{
diag.NewErrorDiagnostic(
"expected list of string",
fmt.Sprintf("expected list element type to be string but got %s", elemType),
),
}
}
elems := []string{}
if diags := a.ElementsAs(ctx, &elems, true); diags.HasError() {
return map[string]interface{}{}, diags
}
settingsValue = elems
case types.Set:
elemType := a.ElementType(ctx)
if elemType != types.StringType {
return map[string]interface{}{}, diag.Diagnostics{
diag.NewErrorDiagnostic(
"expected set of string",
fmt.Sprintf("expected set element type to be string but got %s", elemType),
),
}
}
elems := []string{}
if diags := a.ElementsAs(ctx, &elems, true); diags.HasError() {
return map[string]interface{}{}, diags
}
settingsValue = elems
default:
return map[string]interface{}{}, diag.Diagnostics{
diag.NewErrorDiagnostic(
"unknown value type",
fmt.Sprintf("unknown index setting value type %s", a.Type(ctx)),
),
}
}
settings[key] = settingsValue
}
}
analysisProperties := map[string]jsontypes.Normalized{
"analyzer": model.AnalysisAnalyzer,
"tokenizer": model.AnalysisTokenizer,
"char_filter": model.AnalysisCharFilter,
"filter": model.AnalysisFilter,
"normalizer": model.AnalysisNormalizer,
}
analysis := map[string]interface{}{}
for name, property := range analysisProperties {
if utils.IsKnown(property) {
var parsedValue map[string]interface{}
if diags := property.Unmarshal(&parsedValue); diags.HasError() {
return map[string]interface{}{}, diags
}
analysis[name] = parsedValue
}
}
if len(analysis) > 0 {
settings["analysis"] = analysis
}
var settingSet []settingsTfSet
if diags := model.Settings.ElementsAs(ctx, &settingSet, true); diags.HasError() {
return map[string]interface{}{}, diags
}
if len(settingSet) == 1 {
var rawSettings []settingTfModel
if diags := settingSet[0].Setting.ElementsAs(ctx, &rawSettings, true); diags.HasError() {
return map[string]interface{}{}, diags
}
for _, setting := range rawSettings {
name := setting.Name.ValueString()
if _, ok := settings[name]; ok {
return map[string]interface{}{}, diag.Diagnostics{
diag.NewErrorDiagnostic(
"duplicate setting definition",
fmt.Sprintf("setting [%s] is both explicitly defined and included in the deprecated raw settings blocks. Please remove it from `settings` to avoid unexpected settings", name),
),
}
}
settings[name] = setting.Value.ValueString()
}
}
return settings, nil
}