code: func (p *Parser) LoadValuesFile(path string) (map[string]cty.Value, hcl.Diagnostics) {
  	body, diags := p.LoadHCLFile(path)
  	if body == nil {
  		return nil, diags
  	}
  
  	vals := make(map[string]cty.Value)
  	attrs, attrDiags := body.JustAttributes()
  	diags = append(diags, attrDiags...)
  	if attrs == nil {
  		return vals, diags
  	}
  
  	for name, attr := range attrs {
  		val, valDiags := attr.Expr.Value(nil)
  		diags = append(diags, valDiags...)
  		vals[name] = val
  	}
  
  	return vals, diags
  }
docs: // LoadValuesFile reads the file at the given path and parses it as a "values
  // file", which is an HCL config file whose top-level attributes are treated
  // as arbitrary key.value pairs.
  //
  // If the file cannot be read -- for example, if it does not exist -- then
  // a nil map will be returned along with error diagnostics. Callers may wish
  // to disregard the returned diagnostics in this case and instead generate
  // their own error message(s) with additional context.
  //
  // If the returned diagnostics has errors when a non-nil map is returned
  // then the map may be incomplete but should be valid enough for careful
  // static analysis.
  //
  // This method wraps LoadHCLFile, and so it inherits the syntax selection
  // behaviors documented for that method.