Alejandro Mery
1 year ago
3 changed files with 71 additions and 43 deletions
@ -0,0 +1,63 @@
|
||||
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...) |
||||
} |
Loading…
Reference in new issue