func NewDiffReport()

in tf/utils.go [58:112]


func NewDiffReport(plan *tfjson.Plan, logs []paltypes.RequestTrace) types.DiffReport {
	out := types.DiffReport{
		Diffs: make([]types.Diff, 0),
		Logs:  logs,
	}
	if plan == nil {
		return out
	}

	for _, resourceChange := range plan.ResourceChanges {
		if resourceChange == nil || resourceChange.Change == nil || resourceChange.Change.Before == nil || resourceChange.Change.After == nil {
			continue
		}
		if !strings.HasPrefix(resourceChange.Address, "azapi_") {
			continue
		}
		if len(resourceChange.Change.Actions) == 1 && resourceChange.Change.Actions[0] == tfjson.ActionNoop {
			continue
		}
		beforeMap, beforeMapOk := resourceChange.Change.Before.(map[string]interface{})
		afterMap, afterMapOk := resourceChange.Change.After.(map[string]interface{})
		if !beforeMapOk || !afterMapOk {
			continue
		}
		if afterMap["id"] == nil {
			logrus.Errorf("resource %s has no id", resourceChange.Address)
			continue
		}

		var change types.Change

		if _, ok := beforeMap["body"].(string); ok {
			change = types.Change{
				Before: beforeMap["body"].(string),
				After:  afterMap["body"].(string),
			}
		} else {
			payloadBefore, _ := json.Marshal(beforeMap["body"])
			payloadAfter, _ := json.Marshal(afterMap["body"])
			change = types.Change{
				Before: string(payloadBefore),
				After:  string(payloadAfter),
			}
		}

		out.Diffs = append(out.Diffs, types.Diff{
			Id:      afterMap["id"].(string),
			Type:    afterMap["type"].(string),
			Address: resourceChange.Address,
			Change:  change,
		})
	}

	return out
}