You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

string_lock_target.go 1.7 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package lockprovider
  2. import (
  3. "fmt"
  4. "github.com/samber/lo"
  5. "gitlink.org.cn/cloudream/common/utils/serder"
  6. )
  7. type StringLockTarget struct {
  8. Components []StringLockTargetComponet `json:"components"`
  9. }
  10. func NewStringLockTarget() *StringLockTarget {
  11. return &StringLockTarget{}
  12. }
  13. func (t *StringLockTarget) AddComponent(values ...any) *StringLockTarget {
  14. t.Components = append(t.Components, StringLockTargetComponet{
  15. Values: lo.Map(values, func(val any, index int) string { return fmt.Sprintf("%v", val) }),
  16. })
  17. return t
  18. }
  19. // IsConflict 判断两个锁对象是否冲突。注:只有相同的结构的Target才有意义
  20. func (t *StringLockTarget) IsConflict(other *StringLockTarget) bool {
  21. if len(t.Components) != len(other.Components) {
  22. return false
  23. }
  24. for i := 0; i < len(t.Components); i++ {
  25. if t.Components[i].IsEquals(&other.Components[i]) {
  26. return true
  27. }
  28. }
  29. return false
  30. }
  31. type StringLockTargetComponet struct {
  32. Values []string `json:"values"`
  33. }
  34. // IsEquals 判断两个Component是否相同。注:只有相同的结构的Component才有意义
  35. func (t *StringLockTargetComponet) IsEquals(other *StringLockTargetComponet) bool {
  36. if len(t.Values) != len(other.Values) {
  37. return false
  38. }
  39. for i := 0; i < len(t.Values); i++ {
  40. if t.Values[i] != other.Values[i] {
  41. return false
  42. }
  43. }
  44. return true
  45. }
  46. func StringLockTargetToString(target *StringLockTarget) (string, error) {
  47. data, err := serder.ObjectToJSON(target)
  48. if err != nil {
  49. return "", err
  50. }
  51. return string(data), nil
  52. }
  53. func StringLockTargetFromString(str string) (StringLockTarget, error) {
  54. var ret StringLockTarget
  55. err := serder.JSONToObject([]byte(str), &ret)
  56. return ret, err
  57. }

公共库

Contributors (1)