|
- package lockprovider
-
- import (
- "fmt"
-
- "github.com/samber/lo"
- "gitlink.org.cn/cloudream/common/utils/serder"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/distlock/types"
- )
-
- type StringLockTarget struct {
- Components []StringLockTargetComponet `json:"components"`
- }
-
- func NewStringLockTarget() *StringLockTarget {
- return &StringLockTarget{}
- }
-
- // Add 添加一个Component,并将其内容设置为compValues
- func (t *StringLockTarget) Add(compValues ...any) *StringLockTarget {
- t.Components = append(t.Components, StringLockTargetComponet{
- Values: lo.Map(compValues, func(val any, index int) string { return fmt.Sprintf("%v", val) }),
- })
-
- return t
- }
-
- // IsConflict 判断两个锁对象是否冲突。注:只有相同的结构的Target才有意义
- func (t *StringLockTarget) IsConflict(other *StringLockTarget) bool {
- if len(t.Components) != len(other.Components) {
- return false
- }
-
- if len(t.Components) == 0 {
- return true
- }
-
- for i := 0; i < len(t.Components); i++ {
- if t.Components[i].IsEquals(&other.Components[i]) {
- return true
- }
- }
-
- return false
- }
-
- func (t *StringLockTarget) Equals(other types.LockTarget) bool {
- st, ok := other.(*StringLockTarget)
- if !ok {
- return false
- }
-
- if len(t.Components) != len(st.Components) {
- return false
- }
-
- for i := 0; i < len(t.Components); i++ {
- if !t.Components[i].IsEquals(&st.Components[i]) {
- return false
- }
- }
-
- return true
- }
-
- type StringLockTargetComponet struct {
- Values []string `json:"values"`
- }
-
- // IsEquals 判断两个Component是否相同。注:只有相同的结构的Component才有意义
- func (t *StringLockTargetComponet) IsEquals(other *StringLockTargetComponet) bool {
- if len(t.Values) != len(other.Values) {
- return false
- }
-
- for i := 0; i < len(t.Values); i++ {
- if t.Values[i] != other.Values[i] {
- return false
- }
- }
-
- return true
- }
-
- func StringLockTargetToString(target *StringLockTarget) (string, error) {
- data, err := serder.ObjectToJSON(target)
- if err != nil {
- return "", err
- }
-
- return string(data), nil
- }
-
- func StringLockTargetFromString(str string) (StringLockTarget, error) {
- var ret StringLockTarget
- err := serder.JSONToObject([]byte(str), &ret)
- return ret, err
- }
|