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  }