in pkg/cloud/api/mutable_resource.go [234:312]
func (u *mutableResource[GA, Alpha, Beta]) postAccess(srcVer meta.Version, flags int) error {
type convert struct {
dest reflect.Value
copyHelper func() error
errors *conversionErrors
}
var src reflect.Value
var conversions []convert
switch srcVer {
case meta.VersionGA:
src = reflect.ValueOf(&u.ga)
if !isPlaceholderType(u.alpha) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.alpha),
copyHelper: func() error { return u.typeTrait.CopyHelperGAtoAlpha(&u.alpha, &u.ga) },
errors: &u.errors[GAToAlphaConversion],
})
}
if !isPlaceholderType(u.beta) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.beta),
copyHelper: func() error { return u.typeTrait.CopyHelperGAtoBeta(&u.beta, &u.ga) },
errors: &u.errors[GAToBetaConversion],
})
}
case meta.VersionAlpha:
src = reflect.ValueOf(&u.alpha)
if !isPlaceholderType(u.ga) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.ga),
copyHelper: func() error { return u.typeTrait.CopyHelperAlphaToGA(&u.ga, &u.alpha) },
errors: &u.errors[AlphaToGAConversion],
})
}
if !isPlaceholderType(u.beta) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.beta),
copyHelper: func() error { return u.typeTrait.CopyHelperAlphaToBeta(&u.beta, &u.alpha) },
errors: &u.errors[AlphaToBetaConversion],
})
}
case meta.VersionBeta:
src = reflect.ValueOf(&u.beta)
if !isPlaceholderType(u.ga) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.ga),
copyHelper: func() error { return u.typeTrait.CopyHelperBetaToGA(&u.ga, &u.beta) },
errors: &u.errors[BetaToGAConversion],
})
}
if !isPlaceholderType(u.alpha) {
conversions = append(conversions, convert{
dest: reflect.ValueOf(&u.alpha),
copyHelper: func() error { return u.typeTrait.CopyHelperBetaToAlpha(&u.alpha, &u.beta) },
errors: &u.errors[BetaToAlphaConversion],
})
}
}
if flags&postAccessSkipValidation == 0 {
if err := checkPostAccess(u.typeTrait.FieldTraits(srcVer), src); err != nil {
return err
}
}
for _, conv := range conversions {
c := newCopier(u.copierOptions...)
if err := c.do(conv.dest, src); err != nil {
return err
}
if err := conv.copyHelper(); err != nil {
return err
}
conv.errors.missingFields = c.missing
}
return nil
}