package zones import ( "io/fs" "path/filepath" "darvaza.org/resolver" "github.com/hack-pad/hackpadfs/os" ) // A ScanOption preconfigures the Zones before scanning type ScanOption func(*Zones, *ScanOptions) error // ScanOptions contains flags used by the initial scan type ScanOptions struct{} func (*Zones) setDefaults(_ *ScanOptions) error { return nil } // NewFS builds a [Zones] tree using the given directory func NewFS(dir fs.FS, domain string, opts ...ScanOption) (*Zones, error) { var scanOptions ScanOptions lockuper := resolver.NewCloudflareLookuper() z := &Zones{ dir: dir, resolver: resolver.NewResolver(lockuper), domain: domain, } for _, opt := range opts { if err := opt(z, &scanOptions); err != nil { return nil, err } } if err := z.setDefaults(&scanOptions); err != nil { return nil, err } if err := z.scan(&scanOptions); err != nil { return nil, err } return z, nil } // New builds a [Zones] tree using the given directory func New(dir, domain string, opts ...ScanOption) (*Zones, error) { dir, err := filepath.Abs(dir) if err != nil { return nil, err } base, err := os.NewFS().Sub(dir[1:]) if err != nil { return nil, err } return NewFS(base, domain, opts...) }