sg/internal/policy/fs.go (63 lines of code) (raw):

package policy import ( "fmt" "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/loader" ) const fsPackageQualifiedIDPrefix = "fs:" // FSPackage is a policy package loaded from the file system. type FSPackage struct { qualifiedID string packageSpec PackageSpec rules []Rule parsedModules map[string]*ast.Module } func loadPackageFromPath(path string) (Package, error) { rv := &FSPackage{ qualifiedID: fsPackageQualifiedIDPrefix + path, } // load rules { policies, err := loader.AllRegos([]string{path}) if err != nil { return nil, fmt.Errorf("failed to load policies: %w", err) } if len(policies.Modules) == 0 { return nil, fmt.Errorf("no policies found from path: %s", path) } rv.parsedModules = policies.ParsedModules() for _, module := range rv.parsedModules { rv.rules = append(rv.rules, loadRulesFromModule(module)...) } } // load package spec { projectSpec, err := loadPackageSpecFromDir(path) if err != nil { return nil, fmt.Errorf("failed to load package spec: %w", err) } rv.packageSpec = projectSpec } return rv, nil } var _ Package = (*FSPackage)(nil) func (p *FSPackage) QualifiedID() string { return p.qualifiedID } func (p *FSPackage) Spec() PackageSpec { return p.packageSpec } func (p *FSPackage) Rules() []Rule { return p.rules } func (p *FSPackage) ParsedModules() map[string]*ast.Module { return p.parsedModules } // LoadPackagesFromPaths loads policy packages from the given paths. func LoadPackagesFromPaths(paths []string) ([]Package, error) { var rv []Package for _, path := range paths { p, err := loadPackageFromPath(path) if err != nil { return nil, err } rv = append(rv, p) } return rv, nil }