package config
import (
"strings"
)
// LookupResult is a value returned by Lookup/LookupAll.
type LookupResult struct {
Kind Kind
Value string
}
// String returns the explicit string value.
func (result LookupResult) String() (string, error) {
switch result.Kind {
case KindString:
return result.Value, nil
case KindValueless:
return "", ErrValueless
case KindMissing:
return "", ErrMissing
default:
return "", ErrMissing
}
}
// Bool interprets this lookup result using Git config boolean rules.
func (result LookupResult) Bool() (bool, error) {
switch result.Kind {
case KindString:
return parseBool(result.Value)
case KindValueless:
return true, nil
case KindMissing:
return false, ErrMissing
default:
return false, ErrMissing
}
}
// Int interprets this lookup result as a Git integer value.
func (result LookupResult) Int() (int, error) {
switch result.Kind {
case KindString:
return parseInt(result.Value)
case KindValueless:
return 0, ErrValueless
case KindMissing:
return 0, ErrMissing
default:
return 0, ErrMissing
}
}
// Int64 interprets this lookup result as a Git int64 value.
func (result LookupResult) Int64() (int64, error) {
switch result.Kind {
case KindString:
return parseInt64(result.Value)
case KindValueless:
return 0, ErrValueless
case KindMissing:
return 0, ErrMissing
default:
return 0, ErrMissing
}
}
// Lookup retrieves the first value for a given section, optional subsection,
// and key.
func (config *Config) Lookup(section, subsection, key string) LookupResult {
section = strings.ToLower(section)
key = strings.ToLower(key)
for _, entry := range config.entries {
if strings.EqualFold(entry.Section, section) &&
entry.Subsection == subsection &&
strings.EqualFold(entry.Key, key) {
return LookupResult{
Kind: entry.Kind,
Value: entry.Value,
}
}
}
return LookupResult{
Kind: KindMissing,
Value: "",
}
}
// LookupAll retrieves all values for a given section, optional subsection,
// and key.
func (config *Config) LookupAll(section, subsection, key string) []LookupResult {
section = strings.ToLower(section)
key = strings.ToLower(key)
var values []LookupResult
for _, entry := range config.entries {
if strings.EqualFold(entry.Section, section) &&
entry.Subsection == subsection &&
strings.EqualFold(entry.Key, key) {
values = append(values, LookupResult{
Kind: entry.Kind,
Value: entry.Value,
})
}
}
return values
}