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.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. // Add 添加一个Component,并将其内容设置为compValues
  14. func (t *StringLockTarget) Add(compValues ...any) *StringLockTarget {
  15. t.Components = append(t.Components, StringLockTargetComponet{
  16. Values: lo.Map(compValues, func(val any, index int) string { return fmt.Sprintf("%v", val) }),
  17. })
  18. return t
  19. }
  20. // IsConflict 判断两个锁对象是否冲突。注:只有相同的结构的Target才有意义
  21. func (t *StringLockTarget) IsConflict(other *StringLockTarget) bool {
  22. if len(t.Components) != len(other.Components) {
  23. return false
  24. }
  25. if len(t.Components) == 0 {
  26. return true
  27. }
  28. for i := 0; i < len(t.Components); i++ {
  29. if t.Components[i].IsEquals(&other.Components[i]) {
  30. return true
  31. }
  32. }
  33. return false
  34. }
  35. type StringLockTargetComponet struct {
  36. Values []string `json:"values"`
  37. }
  38. // IsEquals 判断两个Component是否相同。注:只有相同的结构的Component才有意义
  39. func (t *StringLockTargetComponet) IsEquals(other *StringLockTargetComponet) bool {
  40. if len(t.Values) != len(other.Values) {
  41. return false
  42. }
  43. for i := 0; i < len(t.Values); i++ {
  44. if t.Values[i] != other.Values[i] {
  45. return false
  46. }
  47. }
  48. return true
  49. }
  50. func StringLockTargetToString(target *StringLockTarget) (string, error) {
  51. data, err := serder.ObjectToJSON(target)
  52. if err != nil {
  53. return "", err
  54. }
  55. return string(data), nil
  56. }
  57. func StringLockTargetFromString(str string) (StringLockTarget, error) {
  58. var ret StringLockTarget
  59. err := serder.JSONToObject([]byte(str), &ret)
  60. return ret, err
  61. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。