On Wednesday, February 7, 2018 at 8:54:12 AM UTC-5, Jakob Borg wrote:
>
> On 7 Feb 2018, at 14:45, Justin Azoff <justin...@gmail.com <javascript:>> 
> wrote:
>
>
> Is there some way to inspect that error to figure out that it was related 
> to reading from 'gr' and not writing to /dev/null?
>
>
> Two options that come to mind are
>
>  - handling the copy yourself so you get separate Read() and Write() calls 
> and can handle their returns accordingly
>

Yes.. I see one easy way to do this.. right now the backend interface I 
came up with uses

    Filter(reader io.Reader, query string, writer io.Writer) error 

But if I changed that to

    Filter(reader io.Reader, query string) (io.Reader, error)

I could do all the copying in one place, and really easily differentiate 
between a read error and a write error.  I think this is also the more 
elegant interface.  The 'backends' are really responsible for reading from 
the log files and shouldn't be concerned with output.

 - wrapping the writer in a type that wraps the Write() call and retains 
> any error returned. You can then ask the writer if it encountered an error 
> after getting an error return from io.Copy.
>

So simple!  This would probably work for the Reader side too. 
 

> I’m sure there are other ways.
>
 
Indeed!  I think my mistake was the Filter interface.. having it be 
responsible for both filtering and writing is probably what caused this 
issue.  If Filter just returns a filtered Reader I'm left with an io.Reader 
and an io.Writer that I can deal with separately.  I think the ultimate 
solution will be a combination of both.. Simplify the interface and wrap 
the Writer with a struct that remembers the last error.  Then I think i 
would look something like

    r, _ = Filter(r, query)
    w = LastErrorWrapper(w)
    _, err = io.Copy(w, r)
    if err != nil and w.LastError != nil { # error writing to output, abort.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to