repo_description: Open Policy Agent (OPA) is an open source, general-purpose policy engine.
repo_topics: authorization cloud-native compliance declarative json opa open-policy-agent policy
code: // Copyright 2021 The OPA Authors.  All rights reserved.
  // Use of this source code is governed by an Apache2
  // license that can be found in the LICENSE file.
  
  package future
  
  import "github.com/open-policy-agent/opa/v1/ast"
  
  // FilterFutureImports filters OUT any future imports from the passed slice of
  // `*ast.Import`s.
  func FilterFutureImports(imps []*ast.Import) []*ast.Import {
  	ret := []*ast.Import{}
  	for _, imp := range imps {
  		path := imp.Path.Value.(ast.Ref)
  		if !ast.FutureRootDocument.Equal(path[0]) {
  			ret = append(ret, imp)
  		}
  	}
  	return ret
  }
  
  // IsAllFutureKeywords returns true if the passed *ast.Import is `future.keywords`
  func IsAllFutureKeywords(imp *ast.Import) bool {
  	path := imp.Path.Value.(ast.Ref)
  	return len(path) == 2 &&
  		ast.FutureRootDocument.Equal(path[0]) &&
  		path[1].Equal(ast.InternedTerm("keywords"))
  }
  
  // IsFutureKeyword returns true if the passed *ast.Import is `future.keywords.{kw}`
  func IsFutureKeyword(imp *ast.Import, kw string) bool {
  	path := imp.Path.Value.(ast.Ref)
  	return len(path) == 3 &&
  		ast.FutureRootDocument.Equal(path[0]) &&
  		path[1].Equal(ast.InternedTerm("keywords")) &&
  		path[2].Equal(ast.StringTerm(kw))
  }
  
  func WhichFutureKeyword(imp *ast.Import) (string, bool) {
  	path := imp.Path.Value.(ast.Ref)
  	if len(path) == 3 &&
  		ast.FutureRootDocument.Equal(path[0]) &&
  		path[1].Equal(ast.InternedTerm("keywords")) {
  		if str, ok := path[2].Value.(ast.String); ok {
  			return string(str), true
  		}
  	}
  	return "", false
  }
  