2023-03-28 18:17:43 +08:00
|
|
|
// Package tree ...
|
|
|
|
//
|
|
|
|
// Description : tree ...
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 2023-03-28 18:12
|
|
|
|
package tree
|
|
|
|
|
2023-03-28 23:56:13 +08:00
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"git.zhangdeman.cn/zhangdeman/util"
|
|
|
|
)
|
|
|
|
|
2023-03-28 18:17:43 +08:00
|
|
|
// Node 节点的数据结构
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 18:12 2023/3/28
|
|
|
|
type Node struct {
|
2023-03-28 18:31:28 +08:00
|
|
|
IsVirtual bool // 是否虚拟节点, 主要应对输入的原始数据为list这一场景
|
2023-03-28 18:17:43 +08:00
|
|
|
Value interface{} // 节点的值
|
2023-03-28 18:39:05 +08:00
|
|
|
ValueType string // 数据类型 string / int64 / float64 / map / list / nil
|
2023-03-28 18:17:43 +08:00
|
|
|
Key string // 节点的key名称(输入的原始名称)
|
|
|
|
Show bool // 节点是否可见
|
|
|
|
ShowKey string // 重新序列化后, 对外输出的Key
|
|
|
|
AllowEdit bool // 当前key是否允许编辑
|
|
|
|
AllowChangeType bool // 在允许编辑的情况下, 是否允许修改数据类型
|
|
|
|
DefaultValue interface{} // 输入为value为nil时候的默认值
|
2023-03-28 18:20:50 +08:00
|
|
|
ParentNode *Node // 父节点
|
|
|
|
PreBrotherNode *Node // 前一个兄弟节点
|
|
|
|
LastBrotherNode *Node // 下一个兄弟节点
|
|
|
|
SonNodeList []*Node // 子节点列表
|
2023-03-28 18:17:43 +08:00
|
|
|
}
|
2023-03-28 23:56:13 +08:00
|
|
|
|
|
|
|
// NewNode 创建新节点
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 23:02 2023/3/28
|
|
|
|
func NewNode(key string, value string, valueType string, parentNode *Node) *Node {
|
|
|
|
n := &Node{
|
|
|
|
IsVirtual: false,
|
|
|
|
Value: value,
|
|
|
|
ValueType: valueType,
|
|
|
|
Key: key,
|
|
|
|
Show: false,
|
|
|
|
ShowKey: "",
|
|
|
|
AllowEdit: false,
|
|
|
|
AllowChangeType: false,
|
|
|
|
DefaultValue: nil,
|
|
|
|
ParentNode: parentNode,
|
|
|
|
PreBrotherNode: nil,
|
|
|
|
LastBrotherNode: nil,
|
|
|
|
SonNodeList: nil,
|
|
|
|
}
|
|
|
|
|
|
|
|
switch valueType {
|
|
|
|
case ValueTypeString:
|
|
|
|
n.Value = value
|
|
|
|
case ValueTypeInteger:
|
|
|
|
var v int64
|
|
|
|
_ = util.ConvertAssign(&v, value)
|
|
|
|
n.Value = v
|
|
|
|
case ValueTypeFloat:
|
|
|
|
var v float64
|
|
|
|
_ = util.ConvertAssign(&v, value)
|
|
|
|
n.Value = v
|
|
|
|
case ValueTypeBool:
|
|
|
|
n.Value = strings.ToLower(value) == "true"
|
|
|
|
case ValueTypeMap:
|
|
|
|
n.Value = map[string]interface{}{}
|
|
|
|
n.SonNodeList = make([]*Node, 0)
|
|
|
|
case ValueTypeArray:
|
|
|
|
n.Value = []interface{}{}
|
|
|
|
n.SonNodeList = make([]*Node, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 处理 preBrother 和 lastBrother
|
|
|
|
if parentNode.ValueType == ValueTypeMap || parentNode.ValueType == ValueTypeArray {
|
|
|
|
// map 和 array 才有所谓的兄弟节点
|
|
|
|
if len(parentNode.SonNodeList) > 0 {
|
|
|
|
// 设置新节点的 pre 节点
|
|
|
|
n.PreBrotherNode = parentNode.SonNodeList[len(parentNode.SonNodeList)-1]
|
|
|
|
// 设置当前最后一个节点的 last 节点
|
|
|
|
parentNode.SonNodeList[len(parentNode.SonNodeList)-1].LastBrotherNode = n
|
|
|
|
}
|
|
|
|
// 新节点追加到子节点末尾
|
|
|
|
parentNode.SonNodeList = append(parentNode.SonNodeList, n)
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewVirtualNode 创建一个新的虚拟节点
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 23:08 2023/3/28
|
|
|
|
func NewVirtualNode() *Node {
|
|
|
|
return &Node{IsVirtual: true, SonNodeList: make([]*Node, 0)}
|
|
|
|
}
|