func (scv *statCacheValue) unmarshalBinary(data []byte) error { if scv == nil { return errors.New("Can't unmarshalBinary into a nil stat cache value") } if scv.Fingerprint != "" { return errors.New("Can't unmarshalBinary into a non empty stat cache value") } parts := bytes.SplitN(data, pipe, 3) if len(parts) != 3 { return fmt.Errorf("Bogus stat cache value; was expecting fingerprint|blobSize|blobRef, got %q", data) } fingerprint := string(parts[0]) buf := bytes.NewReader(parts[1]) var size int32 err := binary.Read(buf, binary.BigEndian, &size) if err != nil { return fmt.Errorf("Could not decode blob size from stat cache value part %q: %v", parts[1], err) } br := new(blob.Ref) if err := br.UnmarshalBinary(parts[2]); err != nil { return fmt.Errorf("Could not unmarshalBinary for %q: %v", parts[2], err) } scv.Fingerprint = statFingerprint(fingerprint) scv.Result = client.PutResult{ BlobRef: *br, Size: uint32(size), Skipped: true, } return nil }