code: func (p *Parser) LoadHCLFile(path string) (hcl.Body, hcl.Diagnostics) {
  	src, err := p.fs.ReadFile(path)
  
  	if err != nil {
  		return nil, hcl.Diagnostics{
  			{
  				Severity: hcl.DiagError,
  				Summary:  "Failed to read file",
  				Detail:   fmt.Sprintf("The file %q could not be read.", path),
  			},
  		}
  	}
  
  	var file *hcl.File
  	var diags hcl.Diagnostics
  	switch {
  	case strings.HasSuffix(path, ".json"):
  		file, diags = p.p.ParseJSON(src, path)
  	default:
  		file, diags = p.p.ParseHCL(src, path)
  	}
  
  	// If the returned file or body is nil, then we'll return a non-nil empty
  	// body so we'll meet our contract that nil means an error reading the file.
  	if file == nil || file.Body == nil {
  		return hcl.EmptyBody(), diags
  	}
  
  	return file.Body, diags
  }
docs: // LoadHCLFile is a low-level method that reads the file at the given path,
  // parses it, and returns the hcl.Body representing its root. In many cases
  // it is better to use one of the other Load*File methods on this type,
  // which additionally decode the root body in some way and return a higher-level
  // construct.
  //
  // If the file cannot be read at all -- e.g. because it does not exist -- then
  // this method will return a nil body and error diagnostics. In this case
  // callers may wish to ignore the provided error diagnostics and produce
  // a more context-sensitive error instead.
  //
  // The file will be parsed using the HCL native syntax unless the filename
  // ends with ".json", in which case the HCL JSON syntax will be used.