1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-25 17:18:05 +08:00
icebergs/lock.go
2023-12-09 18:03:47 +08:00

109 lines
2.5 KiB
Go

package ice
import (
kit "shylinux.com/x/toolkits"
)
func (m *Message) index(key string, index int, value ...string) string {
if len(value) > 0 {
defer m.lock.Lock()()
m._meta[key][index] = value[0]
} else {
defer m.lock.RLock()()
}
return kit.Select("", m._meta[key], index)
}
func (m *Message) value(key string, list ...string) []string {
if len(list) > 0 {
defer m.lock.Lock()()
m._meta[key] = list
} else {
defer m.lock.RLock()()
}
return m._meta[key]
}
func (m *Message) delete(key ...string) {
defer m.lock.Lock()()
for _, key := range key {
delete(m._meta, key)
}
}
func (m *Message) Add(key string, arg ...string) *Message {
if len(arg) == 0 {
return m
}
defer m.lock.Lock()()
switch key {
case MSG_DETAIL, MSG_RESULT:
m._meta[key] = append(m._meta[key], arg...)
case MSG_OPTION, MSG_APPEND:
if index := 0; key == MSG_APPEND {
if m._meta[MSG_OPTION], index = kit.SliceRemove(m._meta[MSG_OPTION], arg[0]); index > -1 {
delete(m._meta, arg[0])
}
}
if m._meta[arg[0]] = append(m._meta[arg[0]], arg[1:]...); kit.IndexOf(m._meta[key], arg[0]) == -1 {
m._meta[key] = append(m._meta[key], arg[0])
}
}
return m
}
func (m *Message) setDetail(key string, arg ...string) *Message {
defer m.lock.Lock()()
for i := 0; i < len(m._meta[KEY]); i++ {
if m._meta[KEY][i] == key {
if len(arg) > 0 {
m._meta[VALUE][i] = arg[0]
return m
}
for ; i < len(m._meta[KEY])-1; i++ {
m._meta[KEY][i] = m._meta[KEY][i+1]
m._meta[VALUE][i] = m._meta[VALUE][i+1]
}
m._meta[KEY] = m._meta[KEY][0:len(m._meta[KEY])]
m._meta[VALUE] = m._meta[VALUE][0:len(m._meta[VALUE])]
return m
}
}
if len(arg) > 0 {
m._meta[KEY] = append(m._meta[KEY], key)
m._meta[VALUE] = append(m._meta[VALUE], arg[0])
}
return m
}
func (m *Message) Optionv(key string, arg ...Any) Any {
key = kit.Select(MSG_OPTION, key)
var unlock func()
if len(arg) > 0 {
unlock = m.lock.Lock()
kit.If(kit.IndexOf(m._meta[MSG_OPTION], key) == -1, func() { m._meta[MSG_OPTION] = append(m._meta[MSG_OPTION], key) })
switch delete(m._data, key); v := arg[0].(type) {
case nil:
delete(m._meta, key)
case string:
m._meta[key] = kit.Simple(arg...)
case []string:
m._meta[key] = v
default:
m._data[key] = v
}
} else {
unlock = m.lock.RLock()
}
if v, ok := m._data[key]; ok {
unlock()
return v
} else if v, ok := m._meta[key]; ok {
unlock()
return v
} else {
unlock()
}
if m.message != nil {
return m.message.Optionv(key)
} else {
return nil
}
}