Skip to content

Patch failing for byte slices when patching onto struct with nil destination #90

Open
@valantonini

Description

@valantonini

I'm getting some unexpected behaviour when diffing and applying the changelog for byte slices. In this example I am comparing 2 structs that have a byte slice and patching the result onto an empty struct that has a nil byte slice. Is this supported behaviour?

Go Playground

package main

import (
	"fmt"

	"github.com/r3labs/diff/v3"
)

type MyType struct {
	MyField []byte
}

func main() {

	left := &MyType{[]byte{208, 72, 51, 52, 175, 134, 76, 84, 143, 38, 99, 184, 128, 24, 107, 163}}
	right := &MyType{[]byte{91, 102, 170, 173, 254, 105, 66, 81, 177, 175, 32, 173, 173, 165, 129, 192}}

	changelog, err := diff.Diff(left, right)
	if err != nil {
		fmt.Println(err)
	}

	dest := &MyType{}
	_ = diff.Patch(changelog, dest)

	fmt.Println(left.MyField)  // [208 72 51 52 175 134 76 84 143 38 99 184 128 24 107 163]
	fmt.Println(right.MyField) // [91 102 170 173 254 105 66 81 177 175 32 173 173 165 129 192]
	fmt.Println(dest.MyField)  // [32 173 173 165 254 192] ?

	// Patchlog errors:

	// [MyField 0] 208 91  Value index 0 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 1] 72 102  Value index 1 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 2] 51 170  Value index 2 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 3] 52 173  Value index 3 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 5] 134 105  Value index 5 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 6] 76 66  Value index 6 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 7] 84 81  Value index 7 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 8] 143 177  Value index 8 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 9] 38 <nil>  Value index 9 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 10] 99 32  Value index 10 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 11] 184 173  Value index 11 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 12] 128 173  Value index 12 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 13] 24 165  Value index 13 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 14] 107 129  Value index 14 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

	// [MyField 15] 163 192  Value index 15 is invalid (cause count 1)
	//  scanning for Value index (cause count 0)

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions