internal/fetcher/main.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package fetcher import ( "context" "io" "alin.ovh/searchix/internal/config" "alin.ovh/searchix/internal/file" "alin.ovh/searchix/internal/index" "alin.ovh/x/log" "github.com/Southclaws/fault" "github.com/Southclaws/fault/fmsg" ) type Options struct { Logger *log.Logger Root *file.Root } type FetchedFiles struct { Revision io.ReadCloser Options io.ReadCloser Packages io.ReadCloser } type Fetcher interface { FetchIfNeeded(context.Context, *index.SourceMeta) (*FetchedFiles, error) } func New( source *config.Source, opts *Options, ) (fetcher Fetcher, err error) { target := source.JoinPath("") exists, err := opts.Root.Exists(target) if err != nil { return nil, fault.Wrap(err, fmsg.With("failed to check if directory exists")) } if !exists { err = opts.Root.MkdirAll(target) if err != nil { return nil, fault.Wrap(err, fmsg.With("failed to create directory")) } } switch source.Fetcher { case config.ChannelNixpkgs: fetcher, err = NewNixpkgsChannelFetcher(source, opts) case config.Channel: fetcher, err = NewChannelFetcher(source, opts) case config.Download: fetcher, err = NewDownloadFetcher(source, opts) default: err = fault.Newf("unsupported fetcher type %s", source.Fetcher.String()) } return } |