code: func (c *DiskTokenCache) readCacheFile() (*cacheFile, error) {
  	// Minimize the time the file is locked on Windows by reading it all at once
  	// and decoding later.
  	//
  	// We also need to open it with FILE_SHARE_DELETE sharing mode to allow
  	// writeCacheFile() below to replace open files (even though it tries to wait
  	// for the file to be closed). For some reason, omitting FILE_SHARE_DELETE
  	// flag causes random sharing violation errors when opening the file for
  	// reading.
  	f, err := openSharedDelete(c.absPath())
  	switch {
  	case os.IsNotExist(err):
  		return &cacheFile{}, nil
  	case err != nil:
  		return nil, err
  	}
  	blob, err := ioutil.ReadAll(f)
  	f.Close()
  	if err != nil {
  		return nil, err
  	}
  
  	cache := &cacheFile{}
  	if err := json.Unmarshal(blob, cache); err != nil {
  		// If the cache file got broken somehow, it makes sense to treat it as
  		// empty (so it can later be overwritten), since it's unlikely it's going
  		// to "fix itself".
  		logging.WithError(err).Warningf(c.Context, "The token cache %s is broken", c.absPath())
  		return &cacheFile{}, nil
  	}
  
  	return cache, nil
  }
docs: // readCacheFile loads the file with cached tokens.