json_filter/tree/node.go

109 lines
3.1 KiB
Go
Raw Normal View History

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-30 16:30:39 +08:00
ObjectStack []string // 对象信息堆栈, 利用栈的括号匹配, 判断某一个对象是否扫面完成
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,
2023-03-30 16:30:39 +08:00
ObjectStack: make([]string, 0),
2023-03-28 23:56:13 +08:00
}
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 {
2023-03-30 16:30:39 +08:00
return &Node{
IsVirtual: true,
SonNodeList: make([]*Node, 0),
ObjectStack: make([]string, 0),
}
2023-03-28 23:56:13 +08:00
}