mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package convert
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/zclconf/go-cty/cty"
 | 
						|
)
 | 
						|
 | 
						|
// conversionTupleToTuple returns a conversion that will make the input
 | 
						|
// tuple type conform to the output tuple type, if possible.
 | 
						|
//
 | 
						|
// Conversion is possible only if the two tuple types have the same number
 | 
						|
// of elements and the corresponding elements by index can be converted.
 | 
						|
//
 | 
						|
// Shallow tuple conversions work the same for both safe and unsafe modes,
 | 
						|
// but the safety flag is passed on to recursive conversions and may thus
 | 
						|
// limit which element type conversions are possible.
 | 
						|
func conversionTupleToTuple(in, out cty.Type, unsafe bool) conversion {
 | 
						|
	inEtys := in.TupleElementTypes()
 | 
						|
	outEtys := out.TupleElementTypes()
 | 
						|
 | 
						|
	if len(inEtys) != len(outEtys) {
 | 
						|
		return nil // no conversion is possible
 | 
						|
	}
 | 
						|
 | 
						|
	elemConvs := make([]conversion, len(inEtys))
 | 
						|
 | 
						|
	for i, outEty := range outEtys {
 | 
						|
		inEty := inEtys[i]
 | 
						|
 | 
						|
		if inEty.Equals(outEty) {
 | 
						|
			// No conversion needed, so we can leave this one nil.
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		elemConvs[i] = getConversion(inEty, outEty, unsafe)
 | 
						|
		if elemConvs[i] == nil {
 | 
						|
			// If a recursive conversion isn't available, then our top-level
 | 
						|
			// configuration is impossible too.
 | 
						|
			return nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// If we get here then a conversion is possible, using the element
 | 
						|
	// conversions given in elemConvs.
 | 
						|
	return func(val cty.Value, path cty.Path) (cty.Value, error) {
 | 
						|
		elemVals := make([]cty.Value, len(elemConvs))
 | 
						|
		path = append(path, nil)
 | 
						|
		pathStep := &path[len(path)-1]
 | 
						|
 | 
						|
		i := 0
 | 
						|
		for it := val.ElementIterator(); it.Next(); i++ {
 | 
						|
			_, val := it.Element()
 | 
						|
			var err error
 | 
						|
 | 
						|
			*pathStep = cty.IndexStep{
 | 
						|
				Key: cty.NumberIntVal(int64(i)),
 | 
						|
			}
 | 
						|
 | 
						|
			conv := elemConvs[i]
 | 
						|
			if conv != nil {
 | 
						|
				val, err = conv(val, path)
 | 
						|
				if err != nil {
 | 
						|
					return cty.NilVal, err
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			elemVals[i] = val
 | 
						|
		}
 | 
						|
 | 
						|
		return cty.TupleVal(elemVals), nil
 | 
						|
	}
 | 
						|
}
 |