code: func valuesSDKEquivalentIsNullOrZero(v cty.Value) bool {
  	if v == cty.NilVal {
  		return true
  	}
  
  	ty := v.Type()
  	switch {
  	case !v.IsKnown():
  		return false
  	case v.IsNull():
  		return true
  
  	// After this point, v is always known and non-null
  	case ty.IsListType() || ty.IsSetType() || ty.IsMapType() || ty.IsObjectType() || ty.IsTupleType():
  		return v.LengthInt() == 0
  	case ty == cty.String:
  		return v.RawEquals(cty.StringVal(""))
  	case ty == cty.Number:
  		return v.RawEquals(cty.Zero)
  	case ty == cty.Bool:
  		return v.RawEquals(cty.False)
  	default:
  		// The above is exhaustive, but for robustness we'll consider anything
  		// else to _not_ be zero unless it is null.
  		return false
  	}
  }
docs: // valuesSDKEquivalentIsNullOrZero returns true if the given value is either
  // null or is the "zero value" (in the SDK/Go sense) for its type.