| package goldclient |
| |
| import ( |
| "context" |
| "io" |
| "os" |
| |
| "go.skia.org/infra/gold-client/go/gcsuploader" |
| "go.skia.org/infra/gold-client/go/httpclient" |
| "go.skia.org/infra/gold-client/go/imagedownloader" |
| ) |
| |
| const ( |
| // ErrorWriterKey is the context key used for the error Writer. If not provided, StdErr will |
| // be used. |
| ErrorWriterKey = contextKey("errWriter") |
| // LogWriterKey is the context key used for the log Writer. If not provided, StdOut will |
| // be used. |
| LogWriterKey = contextKey("logWriter") |
| |
| gcsUploaderKey = contextKey("gcsUploader") |
| httpClientKey = contextKey("httpClient") |
| imageDownloaderKey = contextKey("imageDownloader") |
| ) |
| |
| type contextKey string |
| |
| // WithContext returns a context with the given authenticated network clients loaded. |
| // By putting these values on the context, it makes it easier to stub out during tests |
| // and not require several extra arguments on each function call. Failure to have these set |
| // will result in panics when the function is called. If values have already been set on this |
| // context, the new value will be ignored. |
| func WithContext(ctx context.Context, g gcsuploader.GCSUploader, h httpclient.HTTPClient, i imagedownloader.ImageDownloader) context.Context { |
| if v := ctx.Value(gcsUploaderKey); v == nil { |
| ctx = context.WithValue(ctx, gcsUploaderKey, g) |
| } |
| if v := ctx.Value(httpClientKey); v == nil { |
| ctx = context.WithValue(ctx, httpClientKey, h) |
| } |
| if v := ctx.Value(imageDownloaderKey); v == nil { |
| ctx = context.WithValue(ctx, imageDownloaderKey, i) |
| } |
| return ctx |
| } |
| |
| func extractGCSUploader(ctx context.Context) gcsuploader.GCSUploader { |
| g, ok := ctx.Value(gcsUploaderKey).(gcsuploader.GCSUploader) |
| if !ok || g == nil { |
| panic("GCSUploader was not set on context. Did you call WithContext?") |
| } |
| return g |
| } |
| |
| func extractHTTPClient(ctx context.Context) httpclient.HTTPClient { |
| h, ok := ctx.Value(httpClientKey).(httpclient.HTTPClient) |
| if !ok || h == nil { |
| panic("HTTPClient was not set on context. Did you call WithContext?") |
| } |
| return h |
| } |
| |
| func extractImageDownloader(ctx context.Context) imagedownloader.ImageDownloader { |
| i, ok := ctx.Value(imageDownloaderKey).(imagedownloader.ImageDownloader) |
| if !ok || i == nil { |
| panic("ImageDownloader was not set on context. Did you call WithContext?") |
| } |
| return i |
| } |
| |
| func extractLogWriter(ctx context.Context) io.Writer { |
| w, ok := ctx.Value(LogWriterKey).(io.Writer) |
| if !ok || w == nil { |
| return os.Stdout |
| } |
| return w |
| } |
| |
| func extractErrorWriter(ctx context.Context) io.Writer { |
| w, ok := ctx.Value(ErrorWriterKey).(io.Writer) |
| if !ok || w == nil { |
| return os.Stderr |
| } |
| return w |
| } |