You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.2 KiB
63 lines
1.2 KiB
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...) |
|
}
|
|
|