podman
61 строка · 1.2 Кб
1package loads
2
3type options struct {
4loader *loader
5}
6
7func defaultOptions() *options {
8return &options{
9loader: loaders,
10}
11}
12
13func loaderFromOptions(options []LoaderOption) *loader {
14opts := defaultOptions()
15for _, apply := range options {
16apply(opts)
17}
18
19return opts.loader
20}
21
22// LoaderOption allows to fine-tune the spec loader behavior
23type LoaderOption func(*options)
24
25// WithDocLoader sets a custom loader for loading specs
26func WithDocLoader(l DocLoader) LoaderOption {
27return func(opt *options) {
28if l == nil {
29return
30}
31opt.loader = &loader{
32DocLoaderWithMatch: DocLoaderWithMatch{
33Fn: l,
34},
35}
36}
37}
38
39// WithDocLoaderMatches sets a chain of custom loaders for loading specs
40// for different extension matches.
41//
42// Loaders are executed in the order of provided DocLoaderWithMatch'es.
43func WithDocLoaderMatches(l ...DocLoaderWithMatch) LoaderOption {
44return func(opt *options) {
45var final, prev *loader
46for _, ldr := range l {
47if ldr.Fn == nil {
48continue
49}
50
51if prev == nil {
52final = &loader{DocLoaderWithMatch: ldr}
53prev = final
54continue
55}
56
57prev = prev.WithNext(&loader{DocLoaderWithMatch: ldr})
58}
59opt.loader = final
60}
61}
62