code: func ReadWhisperSchemas(filename string) (WhisperSchemas, error) {
  	config, err := parseIniFile(filename)
  	if err != nil {
  		return nil, err
  	}
  
  	var schemas WhisperSchemas
  
  	for i, section := range config {
  		schema := Schema{}
  		schema.Name = section["name"]
  
  		if section["pattern"] == "" {
  			return nil, fmt.Errorf("[persister] Empty pattern for [%s]", schema.Name)
  		}
  		schema.Pattern, err = regexp.Compile(section["pattern"])
  		if err != nil {
  			return nil, fmt.Errorf("[persister] Failed to parse pattern %q for [%s]: %s",
  				section["pattern"], schema.Name, err.Error())
  		}
  		schema.RetentionStr = section["retentions"]
  		schema.Retentions, err = ParseRetentionDefs(schema.RetentionStr)
  
  		if err != nil {
  			return nil, fmt.Errorf("[persister] Failed to parse retentions %q for [%s]: %s",
  				schema.RetentionStr, schema.Name, err.Error())
  		}
  
  		p := int64(0)
  		if section["priority"] != "" {
  			p, err = strconv.ParseInt(section["priority"], 10, 0)
  			if err != nil {
  				return nil, fmt.Errorf("[persister] Failed to parse priority %q for [%s]: %s", section["priority"], schema.Name, err)
  			}
  		}
  		schema.Priority = int64(p)<<32 - int64(i) // to sort records with same priority by position in file
  
  		schemas = append(schemas, schema)
  	}
  
  	sort.Sort(schemas)
  	return schemas, nil
  }
docs: // ReadWhisperSchemas reads and parses a storage-schemas.conf file and returns a sorted
  // schemas structure
  // see https://graphite.readthedocs.io/en/0.9.9/config-carbon.html#storage-schemas-conf