feat(properties): log properties information

This commit is contained in:
Jan De Dobbeleer 2023-04-05 20:38:05 +02:00 committed by Jan De Dobbeleer
parent b4b3698ae6
commit 1f59e3d420
4 changed files with 244 additions and 186 deletions

View file

@ -405,7 +405,11 @@ func (segment *Segment) mapSegmentWithWriter(env platform.Environment) error {
if f, ok := Segments[segment.Type]; ok { if f, ok := Segments[segment.Type]; ok {
writer := f() writer := f()
writer.Init(segment.Properties, env) wrapper := &properties.Wrapper{
Properties: segment.Properties,
Env: env,
}
writer.Init(wrapper, env)
segment.writer = writer segment.writer = writer
return nil return nil
} }

207
src/properties/map.go Normal file
View file

@ -0,0 +1,207 @@
package properties
import (
"fmt"
"github.com/jandedobbeleer/oh-my-posh/src/ansi"
"github.com/jandedobbeleer/oh-my-posh/src/regex"
)
type Properties interface {
GetColor(property Property, defaultColor string) string
GetBool(property Property, defaultValue bool) bool
GetString(property Property, defaultValue string) string
GetFloat64(property Property, defaultValue float64) float64
GetInt(property Property, defaultValue int) int
GetKeyValueMap(property Property, defaultValue map[string]string) map[string]string
GetStringArray(property Property, defaultValue []string) []string
}
// Property defines one property of a segment for context
type Property string
// general Properties used across Segments
const (
// Style indicates the style to use
Style Property = "style"
// IncludeFolders indicates folders to be included for the segment logic
IncludeFolders Property = "include_folders"
// ExcludeFolders indicates folders to be excluded for the segment logic
ExcludeFolders Property = "exclude_folders"
// IgnoreFolders is a duplicate of ExcludeFolders
IgnoreFolders Property = "ignore_folders"
// FetchVersion decides whether to fetch the version number or not
FetchVersion Property = "fetch_version"
// AlwaysEnabled decides whether or not to always display the info
AlwaysEnabled Property = "always_enabled"
// VersionURLTemplate is the template to use when building language segment hyperlink
VersionURLTemplate Property = "version_url_template"
// DisplayError decides whether to display when an error occurs or not
DisplayError Property = "display_error"
// DisplayDefault hides or shows the default
DisplayDefault Property = "display_default"
// AccessToken is the access token to use for an API
AccessToken Property = "access_token"
// RefreshToken is the refresh token to use for an API
RefreshToken Property = "refresh_token"
// HTTPTimeout timeout used when executing http request
HTTPTimeout Property = "http_timeout"
// DefaultHTTPTimeout default timeout used when executing http request
DefaultHTTPTimeout = 20
// DefaultCacheTimeout default timeout used when caching data
DefaultCacheTimeout = 10
// CacheTimeout cache timeout
CacheTimeout Property = "cache_timeout"
)
type Map map[Property]interface{}
func (m Map) GetString(property Property, defaultValue string) string {
val, found := m[property]
if !found {
return defaultValue
}
return fmt.Sprint(val)
}
func (m Map) GetColor(property Property, defaultValue string) string {
val, found := m[property]
if !found {
return defaultValue
}
colorString := fmt.Sprint(val)
if ansi.IsAnsiColorName(colorString) {
return colorString
}
values := regex.FindNamedRegexMatch(`(?P<color>#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|p:.*)`, colorString)
if values != nil && values["color"] != "" {
return values["color"]
}
return defaultValue
}
func (m Map) GetBool(property Property, defaultValue bool) bool {
val, found := m[property]
if !found {
return defaultValue
}
boolValue, ok := val.(bool)
if !ok {
return defaultValue
}
return boolValue
}
func (m Map) GetFloat64(property Property, defaultValue float64) float64 {
val, found := m[property]
if !found {
return defaultValue
}
switch v := val.(type) {
case int:
return float64(v)
case int64:
return float64(v)
case uint64:
return float64(v)
case float64:
return v
default:
return defaultValue
}
}
func (m Map) GetInt(property Property, defaultValue int) int {
val, found := m[property]
if !found {
return defaultValue
}
switch v := val.(type) {
case int:
return v
case int64:
return int(v)
case float64:
intValue, ok := val.(float64)
if !ok {
return defaultValue
}
return int(intValue)
default:
return defaultValue
}
}
func (m Map) GetKeyValueMap(property Property, defaultValue map[string]string) map[string]string {
val, found := m[property]
if !found {
return defaultValue
}
keyValues := parseKeyValueArray(val)
return keyValues
}
func (m Map) GetStringArray(property Property, defaultValue []string) []string {
val, found := m[property]
if !found {
return defaultValue
}
keyValues := ParseStringArray(val)
return keyValues
}
func ParseStringArray(param interface{}) []string {
switch v := param.(type) {
default:
return []string{}
case []interface{}:
list := make([]string, len(v))
for i, v := range v {
list[i] = fmt.Sprint(v)
}
return list
case []string:
return v
}
}
func parseKeyValueArray(param interface{}) map[string]string {
switch v := param.(type) {
default:
return map[string]string{}
case map[interface{}]interface{}:
keyValueArray := make(map[string]string)
for key, value := range v {
val := value.(string)
keyString := fmt.Sprintf("%v", key)
keyValueArray[keyString] = val
}
return keyValueArray
case map[string]interface{}:
keyValueArray := make(map[string]string)
for key, value := range v {
val := value.(string)
keyValueArray[key] = val
}
return keyValueArray
case []interface{}:
keyValueArray := make(map[string]string)
for _, s := range v {
l := ParseStringArray(s)
if len(l) == 2 {
key := l[0]
val := l[1]
keyValueArray[key] = val
}
}
return keyValueArray
case map[string]string:
return v
}
}

View file

@ -3,205 +3,52 @@ package properties
import ( import (
"fmt" "fmt"
"github.com/jandedobbeleer/oh-my-posh/src/ansi" "github.com/jandedobbeleer/oh-my-posh/src/platform"
"github.com/jandedobbeleer/oh-my-posh/src/regex"
) )
type Properties interface { type Wrapper struct {
GetColor(property Property, defaultColor string) string Properties Map
GetBool(property Property, defaultValue bool) bool Env platform.Environment
GetString(property Property, defaultValue string) string
GetFloat64(property Property, defaultValue float64) float64
GetInt(property Property, defaultValue int) int
GetKeyValueMap(property Property, defaultValue map[string]string) map[string]string
GetStringArray(property Property, defaultValue []string) []string
} }
// Property defines one property of a segment for context func (w *Wrapper) GetColor(property Property, defaultColor string) string {
type Property string value := w.Properties.GetColor(property, defaultColor)
w.Env.Debug(fmt.Sprintf("%s: %s", property, value))
// general Properties used across Segments return value
const (
// Style indicates the style to use
Style Property = "style"
// IncludeFolders indicates folders to be included for the segment logic
IncludeFolders Property = "include_folders"
// ExcludeFolders indicates folders to be excluded for the segment logic
ExcludeFolders Property = "exclude_folders"
// IgnoreFolders is a duplicate of ExcludeFolders
IgnoreFolders Property = "ignore_folders"
// FetchVersion decides whether to fetch the version number or not
FetchVersion Property = "fetch_version"
// AlwaysEnabled decides whether or not to always display the info
AlwaysEnabled Property = "always_enabled"
// VersionURLTemplate is the template to use when building language segment hyperlink
VersionURLTemplate Property = "version_url_template"
// DisplayError decides whether to display when an error occurs or not
DisplayError Property = "display_error"
// DisplayDefault hides or shows the default
DisplayDefault Property = "display_default"
// AccessToken is the access token to use for an API
AccessToken Property = "access_token"
// RefreshToken is the refresh token to use for an API
RefreshToken Property = "refresh_token"
// HTTPTimeout timeout used when executing http request
HTTPTimeout Property = "http_timeout"
// DefaultHTTPTimeout default timeout used when executing http request
DefaultHTTPTimeout = 20
// DefaultCacheTimeout default timeout used when caching data
DefaultCacheTimeout = 10
// CacheTimeout cache timeout
CacheTimeout Property = "cache_timeout"
)
type Map map[Property]interface{}
func (m Map) GetString(property Property, defaultValue string) string {
val, found := m[property]
if !found {
return defaultValue
}
return fmt.Sprint(val)
} }
func (m Map) GetColor(property Property, defaultValue string) string { func (w *Wrapper) GetBool(property Property, defaultValue bool) bool {
val, found := m[property] value := w.Properties.GetBool(property, defaultValue)
if !found { w.Env.Debug(fmt.Sprintf("%s: %t", property, value))
return defaultValue return value
}
colorString := fmt.Sprint(val)
if ansi.IsAnsiColorName(colorString) {
return colorString
}
values := regex.FindNamedRegexMatch(`(?P<color>#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|p:.*)`, colorString)
if values != nil && values["color"] != "" {
return values["color"]
}
return defaultValue
} }
func (m Map) GetBool(property Property, defaultValue bool) bool { func (w *Wrapper) GetString(property Property, defaultValue string) string {
val, found := m[property] value := w.Properties.GetString(property, defaultValue)
if !found { w.Env.Debug(value)
return defaultValue return value
}
boolValue, ok := val.(bool)
if !ok {
return defaultValue
}
return boolValue
} }
func (m Map) GetFloat64(property Property, defaultValue float64) float64 { func (w *Wrapper) GetFloat64(property Property, defaultValue float64) float64 {
val, found := m[property] value := w.Properties.GetFloat64(property, defaultValue)
if !found { w.Env.Debug(fmt.Sprintf("%s: %f", property, value))
return defaultValue return value
} }
switch v := val.(type) { func (w *Wrapper) GetInt(property Property, defaultValue int) int {
case int: value := w.Properties.GetInt(property, defaultValue)
return float64(v) w.Env.Debug(fmt.Sprintf("%s: %d", property, value))
case int64: return value
return float64(v)
case uint64:
return float64(v)
case float64:
return v
default:
return defaultValue
}
} }
func (m Map) GetInt(property Property, defaultValue int) int { func (w *Wrapper) GetKeyValueMap(property Property, defaultValue map[string]string) map[string]string {
val, found := m[property] value := w.Properties.GetKeyValueMap(property, defaultValue)
if !found { w.Env.Debug(fmt.Sprintf("%s: %v", property, value))
return defaultValue return value
} }
switch v := val.(type) { func (w *Wrapper) GetStringArray(property Property, defaultValue []string) []string {
case int: value := w.Properties.GetStringArray(property, defaultValue)
return v w.Env.Debug(fmt.Sprintf("%s: %v", property, value))
case int64: return value
return int(v)
case float64:
intValue, ok := val.(float64)
if !ok {
return defaultValue
}
return int(intValue)
default:
return defaultValue
}
}
func (m Map) GetKeyValueMap(property Property, defaultValue map[string]string) map[string]string {
val, found := m[property]
if !found {
return defaultValue
}
keyValues := parseKeyValueArray(val)
return keyValues
}
func (m Map) GetStringArray(property Property, defaultValue []string) []string {
val, found := m[property]
if !found {
return defaultValue
}
keyValues := ParseStringArray(val)
return keyValues
}
func ParseStringArray(param interface{}) []string {
switch v := param.(type) {
default:
return []string{}
case []interface{}:
list := make([]string, len(v))
for i, v := range v {
list[i] = fmt.Sprint(v)
}
return list
case []string:
return v
}
}
func parseKeyValueArray(param interface{}) map[string]string {
switch v := param.(type) {
default:
return map[string]string{}
case map[interface{}]interface{}:
keyValueArray := make(map[string]string)
for key, value := range v {
val := value.(string)
keyString := fmt.Sprintf("%v", key)
keyValueArray[keyString] = val
}
return keyValueArray
case map[string]interface{}:
keyValueArray := make(map[string]string)
for key, value := range v {
val := value.(string)
keyValueArray[key] = val
}
return keyValueArray
case []interface{}:
keyValueArray := make(map[string]string)
for _, s := range v {
l := ParseStringArray(s)
if len(l) == 2 {
key := l[0]
val := l[1]
keyValueArray[key] = val
}
}
return keyValueArray
case map[string]string:
return v
}
} }