-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a utility function with filenames #4
Comments
A better alternative would be an option or wrapper that allows adding context to a diff operation, such as filenames. For example, imagine if I could write:
Or using option func parameters:
|
What do you think about type Writeable interface {
// WriteATo writes the element a[idx] to w.
WriteATo(w io.Writer, idx int) (int, error)
// WriteBTo writes the element b[idx] to w.
WriteBTo(w io.Writer, idx int) (int, error)
} And then have func (e EditScript) WriteUnified(w io.Writer, ab Writeable, ctx ...WriteContext) (int, error) Where type WriteContext interface {
private() // private ensures that only types in this package can implement WriteContext
}
func WithNames(a, b string) WriteContext() {
return names{a, b}
}
type names struct {
a, b string
} And then WriteUnified can simply peer inside all WriteContexts provided, since it knows all possible types that can occur. Use would look something like this: ab := diff.Strings(a, b)
n, err := diff.WriteUnified(w, ab, diff.WithNames("before.txt", "after.txt"), diff.WithTimes(atime, btime)) (If no write contexts were provided, we'd use the names |
I don't like Why not call these options or metadata, which is much more common? Beyond that, I like making names optional and the interface smaller. |
I implemented WriteOpts as discussed here, and renamed Writeable to WriterTo. I think this has helped. I'm going to leave this open for future discussion and work on the original idea, which was a utility for diffing files, including a bunch of niceties discussed in the OP. |
That is,
func Files(left, right string) DiffWriteable
. It would read the contents of the files up-front and diff the lines as[]string
or[][]byte
, while including the original filenames. It would also do things that are common when one diffs plaintext files, such as treating windows line endings like unix line endings, or ignoring a trailing newline unless it appears/disappears.In the rare case that someone needs this to support streaming, they can just easily implement the interface themselves.
The text was updated successfully, but these errors were encountered: