git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/object/splitinfo.go (about) 1 package object 2 3 import ( 4 "errors" 5 "fmt" 6 7 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object" 8 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs" 9 oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" 10 ) 11 12 type SplitInfo object.SplitInfo 13 14 // NewSplitInfoFromV2 wraps v2 SplitInfo message to SplitInfo. 15 // 16 // Nil object.SplitInfo converts to nil. 17 func NewSplitInfoFromV2(v2 *object.SplitInfo) *SplitInfo { 18 return (*SplitInfo)(v2) 19 } 20 21 // NewSplitInfo creates and initializes blank SplitInfo. 22 // 23 // Defaults: 24 // - splitID: nil; 25 // - lastPart nil; 26 // - link: nil. 27 func NewSplitInfo() *SplitInfo { 28 return NewSplitInfoFromV2(new(object.SplitInfo)) 29 } 30 31 // ToV2 converts SplitInfo to v2 SplitInfo message. 32 // 33 // Nil SplitInfo converts to nil. 34 func (s *SplitInfo) ToV2() *object.SplitInfo { 35 return (*object.SplitInfo)(s) 36 } 37 38 func (s *SplitInfo) SplitID() *SplitID { 39 return NewSplitIDFromV2( 40 (*object.SplitInfo)(s).GetSplitID()) 41 } 42 43 func (s *SplitInfo) SetSplitID(v *SplitID) { 44 (*object.SplitInfo)(s).SetSplitID(v.ToV2()) 45 } 46 47 func (s SplitInfo) LastPart() (v oid.ID, isSet bool) { 48 v2 := (object.SplitInfo)(s) 49 50 lpV2 := v2.GetLastPart() 51 if lpV2 != nil { 52 _ = v.ReadFromV2(*lpV2) 53 isSet = true 54 } 55 56 return 57 } 58 59 func (s *SplitInfo) SetLastPart(v oid.ID) { 60 var idV2 refs.ObjectID 61 v.WriteToV2(&idV2) 62 63 (*object.SplitInfo)(s).SetLastPart(&idV2) 64 } 65 66 func (s SplitInfo) Link() (v oid.ID, isSet bool) { 67 v2 := (object.SplitInfo)(s) 68 69 linkV2 := v2.GetLink() 70 if linkV2 != nil { 71 _ = v.ReadFromV2(*linkV2) 72 isSet = true 73 } 74 75 return 76 } 77 78 func (s *SplitInfo) SetLink(v oid.ID) { 79 var idV2 refs.ObjectID 80 v.WriteToV2(&idV2) 81 82 (*object.SplitInfo)(s).SetLink(&idV2) 83 } 84 85 func (s *SplitInfo) Marshal() ([]byte, error) { 86 return (*object.SplitInfo)(s).StableMarshal(nil), nil 87 } 88 89 func (s *SplitInfo) Unmarshal(data []byte) error { 90 err := (*object.SplitInfo)(s).Unmarshal(data) 91 if err != nil { 92 return err 93 } 94 95 return formatCheckSI((*object.SplitInfo)(s)) 96 } 97 98 // MarshalJSON implements json.Marshaler. 99 func (s *SplitInfo) MarshalJSON() ([]byte, error) { 100 return (*object.SplitInfo)(s).MarshalJSON() 101 } 102 103 // UnmarshalJSON implements json.Unmarshaler. 104 func (s *SplitInfo) UnmarshalJSON(data []byte) error { 105 err := (*object.SplitInfo)(s).UnmarshalJSON(data) 106 if err != nil { 107 return err 108 } 109 110 return formatCheckSI((*object.SplitInfo)(s)) 111 } 112 113 var errSplitInfoMissingFields = errors.New("neither link object ID nor last part object ID is set") 114 115 func formatCheckSI(v2 *object.SplitInfo) error { 116 link := v2.GetLink() 117 lastPart := v2.GetLastPart() 118 if link == nil && lastPart == nil { 119 return errSplitInfoMissingFields 120 } 121 122 var oID oid.ID 123 124 if link != nil { 125 err := oID.ReadFromV2(*link) 126 if err != nil { 127 return fmt.Errorf("could not convert link object ID: %w", err) 128 } 129 } 130 131 if lastPart != nil { 132 err := oID.ReadFromV2(*lastPart) 133 if err != nil { 134 return fmt.Errorf("could not convert last part object ID: %w", err) 135 } 136 } 137 138 return nil 139 }