2019-03-13 04:14:30 -07:00
|
|
|
package main
|
|
|
|
|
2020-09-17 07:51:29 -07:00
|
|
|
import "errors"
|
|
|
|
|
2019-03-13 04:14:30 -07:00
|
|
|
//Segment represent a single segment and it's configuration
|
|
|
|
type Segment struct {
|
2020-09-27 00:37:50 -07:00
|
|
|
Type SegmentType `json:"type"`
|
|
|
|
Style SegmentStyle `json:"style"`
|
|
|
|
PowerlineSymbol string `json:"powerline_symbol"`
|
|
|
|
InvertPowerline bool `json:"invert_powerline"`
|
|
|
|
Foreground string `json:"foreground"`
|
|
|
|
Background string `json:"background"`
|
|
|
|
LeadingDiamond string `json:"leading_diamond"`
|
|
|
|
TrailingDiamond string `json:"trailing_diamond"`
|
|
|
|
Properties map[Property]interface{} `json:"properties"`
|
|
|
|
writer SegmentWriter
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
//SegmentWriter is the interface used to define what and if to write to the prompt
|
|
|
|
type SegmentWriter interface {
|
|
|
|
enabled() bool
|
|
|
|
string() string
|
|
|
|
init(props *properties, env environmentInfo)
|
|
|
|
}
|
|
|
|
|
|
|
|
//SegmentStyle the syle of segment, for more information, see the constants
|
|
|
|
type SegmentStyle string
|
|
|
|
|
|
|
|
//SegmentType the type of segment, for more information, see the constants
|
|
|
|
type SegmentType string
|
|
|
|
|
|
|
|
const (
|
|
|
|
//Session represents the user info segment
|
|
|
|
Session SegmentType = "session"
|
|
|
|
//Path represents the current path segment
|
|
|
|
Path SegmentType = "path"
|
|
|
|
//Git represents the git status and information
|
|
|
|
Git SegmentType = "git"
|
|
|
|
//Exit writes the last exit code
|
|
|
|
Exit SegmentType = "exit"
|
2020-10-02 02:55:27 -07:00
|
|
|
//Python writes the virtual env name
|
|
|
|
Python SegmentType = "python"
|
2019-03-13 04:14:30 -07:00
|
|
|
//Root writes root symbol
|
|
|
|
Root SegmentType = "root"
|
|
|
|
//Time writes the current timestamp
|
|
|
|
Time SegmentType = "time"
|
|
|
|
//Text writes a text
|
|
|
|
Text SegmentType = "text"
|
|
|
|
//Cmd writes the output of a shell command
|
|
|
|
Cmd SegmentType = "command"
|
|
|
|
//Battery writes the battery percentage
|
|
|
|
Battery SegmentType = "battery"
|
|
|
|
//Spotify writes the Spotify status for Mac
|
|
|
|
Spotify SegmentType = "spotify"
|
2020-09-15 04:44:53 -07:00
|
|
|
//ShellInfo writes which shell we're currently in
|
|
|
|
ShellInfo SegmentType = "shell"
|
2020-10-01 11:57:02 -07:00
|
|
|
//Node writes which node version is currently active
|
|
|
|
Node SegmentType = "node"
|
2020-10-09 03:51:22 -07:00
|
|
|
//Os write os specific icon
|
2020-10-07 12:01:03 -07:00
|
|
|
Os SegmentType = "os"
|
2020-10-09 10:22:32 -07:00
|
|
|
//EnvVar writes the content of an environment variable
|
|
|
|
EnvVar SegmentType = "envvar"
|
2019-03-13 04:14:30 -07:00
|
|
|
//Powerline writes it Powerline style
|
|
|
|
Powerline SegmentStyle = "powerline"
|
|
|
|
//Plain writes it without ornaments
|
|
|
|
Plain SegmentStyle = "plain"
|
|
|
|
//Diamond writes the prompt shaped with a leading and trailing symbol
|
|
|
|
Diamond SegmentStyle = "diamond"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (segment *Segment) string() string {
|
|
|
|
return segment.writer.string()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (segment *Segment) enabled() bool {
|
|
|
|
return segment.writer.enabled()
|
|
|
|
}
|
|
|
|
|
2020-10-02 07:58:25 -07:00
|
|
|
func (segment *Segment) getValue(property Property, defaultValue string) string {
|
|
|
|
if value, ok := segment.Properties[property]; ok {
|
|
|
|
return parseString(value, defaultValue)
|
|
|
|
}
|
|
|
|
return defaultValue
|
|
|
|
}
|
|
|
|
|
|
|
|
func (segment *Segment) hasValue(property Property, match string) bool {
|
|
|
|
if value, ok := segment.Properties[property]; ok {
|
|
|
|
list := parseStringArray(value)
|
|
|
|
for _, element := range list {
|
|
|
|
if element == match {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-09-17 07:51:29 -07:00
|
|
|
func (segment *Segment) mapSegmentWithWriter(env environmentInfo) (*properties, error) {
|
2019-03-13 04:14:30 -07:00
|
|
|
functions := map[SegmentType]SegmentWriter{
|
2020-09-15 04:44:53 -07:00
|
|
|
Session: &session{},
|
|
|
|
Path: &path{},
|
|
|
|
Git: &git{},
|
|
|
|
Exit: &exit{},
|
2020-10-02 02:55:27 -07:00
|
|
|
Python: &python{},
|
2020-09-15 04:44:53 -07:00
|
|
|
Root: &root{},
|
|
|
|
Text: &text{},
|
|
|
|
Time: &tempus{},
|
|
|
|
Cmd: &command{},
|
|
|
|
Battery: &batt{},
|
|
|
|
Spotify: &spotify{},
|
|
|
|
ShellInfo: &shell{},
|
2020-10-01 11:57:02 -07:00
|
|
|
Node: &node{},
|
2020-10-07 12:01:03 -07:00
|
|
|
Os: &osInfo{},
|
2020-10-09 10:22:32 -07:00
|
|
|
EnvVar: &envvar{},
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
|
|
|
if writer, ok := functions[segment.Type]; ok {
|
|
|
|
props := &properties{
|
|
|
|
values: segment.Properties,
|
|
|
|
foreground: segment.Foreground,
|
|
|
|
background: segment.Background,
|
|
|
|
}
|
|
|
|
writer.init(props, env)
|
|
|
|
segment.writer = writer
|
2020-09-17 07:51:29 -07:00
|
|
|
return props, nil
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
2020-09-17 07:51:29 -07:00
|
|
|
return nil, errors.New("Unable to map writer")
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|