1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
icebergs/misc.go
2023-03-25 11:44:04 +08:00

138 lines
3.8 KiB
Go

package ice
import (
"strings"
kit "shylinux.com/x/toolkits"
)
func (m *Message) Split(str string, arg ...string) *Message {
m.Set(MSG_APPEND).Set(MSG_RESULT)
field := kit.Select("", arg, 0)
sp := kit.Select(SP, arg, 1)
nl := kit.Select(NL, arg, 2)
fields, indexs := kit.Split(field, sp, sp, sp), []int{}
for i, l := range kit.Split(str, nl, nl, nl) {
if strings.HasPrefix(l, "Binary") {
continue
}
if strings.TrimSpace(l) == "" {
continue
}
if i == 0 && (field == "" || field == INDEX) {
if fields = kit.Split(l, sp, sp); field == INDEX {
if strings.HasPrefix(l, SP) || strings.HasPrefix(l, TB) {
indexs = append(indexs, 0)
for _, v := range fields {
indexs = append(indexs, strings.Index(l, v)+len(v))
}
indexs = indexs[0 : len(indexs)-1]
} else {
for _, v := range fields {
indexs = append(indexs, strings.Index(l, v))
}
}
}
continue
}
if len(indexs) > 0 {
for i, v := range indexs {
if v >= len(l) {
m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), "")
continue
}
if i == len(indexs)-1 {
m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:]))
} else {
m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:indexs[i+1]]))
}
}
continue
}
ls := kit.Split(l, sp, sp)
for i, v := range ls {
if i == len(fields)-1 {
m.Push(kit.Select(SP, fields, i), strings.Join(ls[i:], sp))
break
}
m.Push(kit.Select(SP, fields, i), v)
}
}
return m
}
func (m *Message) SplitIndex(str string, arg ...string) *Message {
return m.Split(str, kit.Simple(INDEX, arg)...)
}
func (m *Message) SetAppend(arg ...string) *Message {
kit.If(len(arg) == 0, func() { m.OptionFields("") })
return m.Set(MSG_APPEND, arg...)
}
func (m *Message) SetResult(arg ...string) *Message { return m.Set(MSG_RESULT, arg...) }
func (m *Message) PushRecord(value Any, arg ...string) *Message {
return m.Push("", value, kit.Split(kit.Join(arg)))
}
func (m *Message) PushDetail(value Any, arg ...string) *Message {
switch v := value.(type) {
case string:
value = kit.UnMarshal(v)
}
return m.Push(FIELDS_DETAIL, value, kit.Split(kit.Join(arg)))
}
func (m *Message) RenameOption(from, to string) *Message {
return m.Options(to, m.Option(from), from, "")
}
func (m *Message) RenameAppend(arg ...string) *Message {
kit.For(arg, func(from, to string) {
if from == to {
return
}
kit.For(m.meta[MSG_APPEND], func(i int, k string) {
if k == from {
m.meta[MSG_APPEND][i], m.meta[to] = to, m.meta[from]
delete(m.meta, from)
}
})
})
return m
}
func (m *Message) ToLowerAppend(arg ...string) *Message {
kit.For(m.meta[MSG_APPEND], func(k string) { m.RenameAppend(k, strings.ToLower(k)) })
return m
}
func (m *Message) AppendSimple(key ...string) (res []string) {
if len(key) == 0 {
if m.FieldsIsDetail() {
key = append(key, m.meta[KEY]...)
} else {
key = append(key, m.Appendv(MSG_APPEND)...)
}
}
kit.For(key, func(k string) { res = append(res, k, m.Append(k)) })
return
}
func (m *Message) AppendTrans(cb func(value string, key string, index int) string) *Message {
if m.FieldsIsDetail() {
for i, v := range m.meta[VALUE] {
k := m.meta[KEY][i]
m.meta[VALUE][i] = cb(v, k, 0)
}
return m
}
for _, k := range m.meta[MSG_APPEND] {
for i, v := range m.meta[k] {
m.meta[k][i] = cb(v, k, i)
}
}
return m
}
func (m *Message) CmdAppend(arg ...Any) string {
args := kit.Simple(arg...)
field := kit.Slice(args, -1)[0]
return m._command(kit.Slice(args, 0, -1), OptionFields(field)).Append(field)
}
func (m *Message) CmdMap(arg ...string) map[string]map[string]string {
field, list := kit.Slice(arg, -1)[0], map[string]map[string]string{}
m._command(kit.Slice(arg, 0, -1)).Table(func(value Maps) { list[value[field]] = value })
return list
}