(ctx context.Context, src any, dest any, opts ...transfer.Opt)
| 66 | } |
| 67 | |
| 68 | func (ts *localTransferService) Transfer(ctx context.Context, src any, dest any, opts ...transfer.Opt) error { |
| 69 | topts := &transfer.Config{} |
| 70 | for _, opt := range opts { |
| 71 | opt(topts) |
| 72 | } |
| 73 | |
| 74 | // Figure out matrix of whether source destination combination is supported |
| 75 | switch s := src.(type) { |
| 76 | case transfer.ImageFetcher: |
| 77 | switch d := dest.(type) { |
| 78 | case transfer.ImageStorer: |
| 79 | return ts.pull(ctx, s, d, topts) |
| 80 | } |
| 81 | case transfer.ImageGetter: |
| 82 | switch d := dest.(type) { |
| 83 | case transfer.ImagePusher: |
| 84 | return ts.push(ctx, s, d, topts) |
| 85 | case transfer.ImageExporter: |
| 86 | return ts.exportStream(ctx, s, d, topts) |
| 87 | case transfer.ImageStorer: |
| 88 | return ts.tag(ctx, s, d, topts) |
| 89 | } |
| 90 | case transfer.ImageImporter: |
| 91 | switch d := dest.(type) { |
| 92 | case transfer.ImageExportStreamer: |
| 93 | return ts.echo(ctx, s, d, topts) |
| 94 | case transfer.ImageStorer: |
| 95 | // TODO: verify imports with ImageVerifiers? |
| 96 | return ts.importStream(ctx, s, d, topts) |
| 97 | } |
| 98 | } |
| 99 | return fmt.Errorf("unable to transfer from %s to %s: %w", name(src), name(dest), errdefs.ErrNotImplemented) |
| 100 | } |
| 101 | |
| 102 | func name(t any) string { |
| 103 | switch s := t.(type) { |
nothing calls this directly
no test coverage detected