mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2025-01-07 09:17:26 -08:00
fb698dd20a
resolves #2098
166 lines
3.2 KiB
Go
166 lines
3.2 KiB
Go
package segments
|
|
|
|
import (
|
|
"encoding/json"
|
|
"encoding/xml"
|
|
"oh-my-posh/environment"
|
|
"oh-my-posh/properties"
|
|
"path/filepath"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
type ProjectItem struct {
|
|
Name string
|
|
File string
|
|
Fetcher func(item ProjectItem) (string, string)
|
|
}
|
|
|
|
type ProjectData struct {
|
|
Version string
|
|
Name string
|
|
}
|
|
|
|
// Rust Cargo package
|
|
type CargoTOML struct {
|
|
Package ProjectData
|
|
}
|
|
|
|
// Python Poetry package
|
|
type PyProjectTOML struct {
|
|
Tool PyProjectToolTOML
|
|
}
|
|
|
|
type PyProjectToolTOML struct {
|
|
Poetry ProjectData
|
|
}
|
|
|
|
type NuSpec struct {
|
|
XMLName xml.Name `xml:"package"`
|
|
MetaData struct {
|
|
Title string `xml:"title"`
|
|
Version string `xml:"version"`
|
|
} `xml:"metadata"`
|
|
}
|
|
|
|
type Project struct {
|
|
props properties.Properties
|
|
env environment.Environment
|
|
|
|
projects []*ProjectItem
|
|
Error string
|
|
|
|
ProjectData
|
|
}
|
|
|
|
func (n *Project) Enabled() bool {
|
|
for _, item := range n.projects {
|
|
if n.hasProjectFile(item) {
|
|
n.Version, n.Name = item.Fetcher(*item)
|
|
return len(n.Version) > 0 || len(n.Name) > 0
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (n *Project) Template() string {
|
|
return " {{ if .Error }}{{ .Error }}{{ else }}{{ if .Version }}\uf487 {{.Version}}{{ end }} {{ if .Name }}{{ .Name }}{{ end }}{{ end }} "
|
|
}
|
|
|
|
func (n *Project) Init(props properties.Properties, env environment.Environment) {
|
|
n.props = props
|
|
n.env = env
|
|
|
|
n.projects = []*ProjectItem{
|
|
{
|
|
Name: "node",
|
|
File: "package.json",
|
|
Fetcher: n.getNodePackage,
|
|
},
|
|
{
|
|
Name: "cargo",
|
|
File: "Cargo.toml",
|
|
Fetcher: n.getCargoPackage,
|
|
},
|
|
{
|
|
Name: "poetry",
|
|
File: "pyproject.toml",
|
|
Fetcher: n.getPoetryPackage,
|
|
},
|
|
{
|
|
Name: "php",
|
|
File: "composer.json",
|
|
Fetcher: n.getNodePackage,
|
|
},
|
|
{
|
|
Name: "nuspec",
|
|
File: "*.nuspec",
|
|
Fetcher: n.getNuSpecPackage,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (n *Project) hasProjectFile(p *ProjectItem) bool {
|
|
return n.env.HasFiles(p.File)
|
|
}
|
|
|
|
func (n *Project) getNodePackage(item ProjectItem) (string, string) {
|
|
content := n.env.FileContent(item.File)
|
|
|
|
var data ProjectData
|
|
err := json.Unmarshal([]byte(content), &data)
|
|
if err != nil {
|
|
n.Error = err.Error()
|
|
return "", ""
|
|
}
|
|
|
|
return data.Version, data.Name
|
|
}
|
|
|
|
func (n *Project) getCargoPackage(item ProjectItem) (string, string) {
|
|
content := n.env.FileContent(item.File)
|
|
|
|
var data CargoTOML
|
|
_, err := toml.Decode(content, &data)
|
|
if err != nil {
|
|
n.Error = err.Error()
|
|
return "", ""
|
|
}
|
|
|
|
return data.Package.Version, data.Package.Name
|
|
}
|
|
|
|
func (n *Project) getPoetryPackage(item ProjectItem) (string, string) {
|
|
content := n.env.FileContent(item.File)
|
|
|
|
var data PyProjectTOML
|
|
_, err := toml.Decode(content, &data)
|
|
if err != nil {
|
|
n.Error = err.Error()
|
|
return "", ""
|
|
}
|
|
|
|
return data.Tool.Poetry.Version, data.Tool.Poetry.Name
|
|
}
|
|
|
|
func (n *Project) getNuSpecPackage(item ProjectItem) (string, string) {
|
|
files := n.env.LsDir(n.env.Pwd())
|
|
var content string
|
|
// get the first match only
|
|
for _, file := range files {
|
|
if filepath.Ext(file.Name()) == ".nuspec" {
|
|
content = n.env.FileContent(file.Name())
|
|
break
|
|
}
|
|
}
|
|
|
|
var data NuSpec
|
|
err := xml.Unmarshal([]byte(content), &data)
|
|
if err != nil {
|
|
n.Error = err.Error()
|
|
return "", ""
|
|
}
|
|
|
|
return data.MetaData.Version, data.MetaData.Title
|
|
}
|