2024-07-30 21:33:28 +02:00
|
|
|
// Copyright 2024, Command Line Inc.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2024-08-20 23:56:48 +02:00
|
|
|
package waveobj
|
2024-07-30 21:33:28 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
const Entity_Any = "any"
|
|
|
|
|
|
|
|
// for typescript typing
|
|
|
|
type MetaTSType struct {
|
|
|
|
// shared
|
2024-08-20 07:07:35 +02:00
|
|
|
View string `json:"view,omitempty"`
|
|
|
|
Controller string `json:"controller,omitempty"`
|
|
|
|
Title string `json:"title,omitempty"`
|
|
|
|
File string `json:"file,omitempty"`
|
|
|
|
Url string `json:"url,omitempty"`
|
|
|
|
Connection string `json:"connection,omitempty"`
|
2024-08-30 22:56:53 +02:00
|
|
|
Edit bool `json:"edit,omitempty"`
|
2024-08-20 07:07:35 +02:00
|
|
|
History []string `json:"history,omitempty"`
|
|
|
|
HistoryForward []string `json:"history:forward,omitempty"`
|
2024-07-30 21:33:28 +02:00
|
|
|
|
2024-08-28 03:49:49 +02:00
|
|
|
DisplayName string `json:"display:name,omitempty"`
|
|
|
|
DisplayOrder float64 `json:"display:order,omitempty"`
|
|
|
|
|
2024-07-30 21:33:28 +02:00
|
|
|
Icon string `json:"icon,omitempty"`
|
|
|
|
IconColor string `json:"icon:color,omitempty"`
|
|
|
|
|
|
|
|
Frame bool `json:"frame,omitempty"`
|
|
|
|
FrameClear bool `json:"frame:*,omitempty"`
|
|
|
|
FrameBorderColor string `json:"frame:bordercolor,omitempty"`
|
|
|
|
FrameBorderColor_Focused string `json:"frame:bordercolor:focused,omitempty"`
|
|
|
|
|
|
|
|
Cmd string `json:"cmd,omitempty"`
|
|
|
|
CmdClear bool `json:"cmd:*,omitempty"`
|
|
|
|
CmdInteractive bool `json:"cmd:interactive,omitempty"`
|
|
|
|
CmdLogin bool `json:"cmd:login,omitempty"`
|
|
|
|
CmdRunOnStart bool `json:"cmd:runonstart,omitempty"`
|
|
|
|
CmdClearOnStart bool `json:"cmd:clearonstart,omitempty"`
|
|
|
|
CmdClearOnRestart bool `json:"cmd:clearonrestart,omitempty"`
|
|
|
|
CmdEnv map[string]string `json:"cmd:env,omitempty"`
|
|
|
|
CmdCwd string `json:"cmd:cwd,omitempty"`
|
|
|
|
CmdNoWsh bool `json:"cmd:nowsh,omitempty"`
|
|
|
|
|
2024-08-30 20:33:04 +02:00
|
|
|
GraphClear bool `json:"graph:*,omitempty"`
|
|
|
|
GraphNumPoints int `json:"graph:numpoints,omitempty"`
|
|
|
|
GraphMetrics []string `json:"graph:metrics,omitempty"`
|
|
|
|
|
2024-07-30 21:33:28 +02:00
|
|
|
// for tabs
|
|
|
|
Bg string `json:"bg,omitempty"`
|
|
|
|
BgClear bool `json:"bg:*,omitempty"`
|
|
|
|
BgOpacity float64 `json:"bg:opacity,omitempty"`
|
|
|
|
BgBlendMode string `json:"bg:blendmode,omitempty"`
|
|
|
|
|
|
|
|
TermClear bool `json:"term:*,omitempty"`
|
|
|
|
TermFontSize int `json:"term:fontsize,omitempty"`
|
|
|
|
TermFontFamily string `json:"term:fontfamily,omitempty"`
|
|
|
|
TermMode string `json:"term:mode,omitempty"`
|
|
|
|
TermTheme string `json:"term:theme,omitempty"`
|
2024-08-01 09:57:06 +02:00
|
|
|
Count int `json:"count,omitempty"` // temp for cpu plot. will remove later
|
2024-07-30 21:33:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type MetaDataDecl struct {
|
|
|
|
Key string `json:"key"`
|
|
|
|
Desc string `json:"desc,omitempty"`
|
|
|
|
Type string `json:"type"` // string, int, float, bool, array, object
|
|
|
|
Default any `json:"default,omitempty"`
|
|
|
|
StrOptions []string `json:"stroptions,omitempty"`
|
|
|
|
NumRange []*int `json:"numrange,omitempty"` // inclusive, null means no limit
|
|
|
|
Entity []string `json:"entity"` // what entities this applies to, e.g. "block", "tab", "any", etc.
|
|
|
|
Special []string `json:"special,omitempty"` // special handling. things that need to happen if this gets updated
|
|
|
|
}
|
|
|
|
|
|
|
|
type MetaPresetDecl struct {
|
|
|
|
Preset string `json:"preset"`
|
|
|
|
Desc string `json:"desc,omitempty"`
|
|
|
|
Keys []string `json:"keys"`
|
|
|
|
Entity []string `json:"entity"` // what entities this applies to, e.g. "block", "tab", etc.
|
|
|
|
}
|
|
|
|
|
|
|
|
// returns a clean copy of meta with mergeMeta merged in
|
2024-08-28 03:49:49 +02:00
|
|
|
// if mergeSpecial is false, then special keys will not be merged (like display:*)
|
|
|
|
func MergeMeta(meta MetaMapType, metaUpdate MetaMapType, mergeSpecial bool) MetaMapType {
|
2024-07-30 21:33:28 +02:00
|
|
|
rtn := make(MetaMapType)
|
|
|
|
for k, v := range meta {
|
|
|
|
rtn[k] = v
|
|
|
|
}
|
|
|
|
// deal with "section:*" keys
|
|
|
|
for k := range metaUpdate {
|
|
|
|
if !strings.HasSuffix(k, ":*") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if !metaUpdate.GetBool(k, false) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
prefix := strings.TrimSuffix(k, ":*")
|
|
|
|
if prefix == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// delete "[prefix]" and all keys that start with "[prefix]:"
|
|
|
|
prefixColon := prefix + ":"
|
|
|
|
for k2 := range rtn {
|
|
|
|
if k2 == prefix || strings.HasPrefix(k2, prefixColon) {
|
|
|
|
delete(rtn, k2)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// now deal with regular keys
|
|
|
|
for k, v := range metaUpdate {
|
2024-08-28 03:49:49 +02:00
|
|
|
if !mergeSpecial && strings.HasPrefix(k, "display:") {
|
2024-07-31 08:22:41 +02:00
|
|
|
continue
|
|
|
|
}
|
2024-07-30 21:33:28 +02:00
|
|
|
if strings.HasSuffix(k, ":*") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if v == nil {
|
|
|
|
delete(rtn, k)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
rtn[k] = v
|
|
|
|
}
|
|
|
|
return rtn
|
|
|
|
}
|