Skip to content

Expose helper functions and allow AST manipulation #45

@erikgeiser

Description

@erikgeiser

Hi, great library you have here! We are building a file globbing library (https://github.com/goreleaser/fileglob) on top of glob which required us to write some helper functions that operate on glob/syntax/ast. Maybe some of these functions are useful to your users and could be exposed directly in the glob library.

Consider the following example (source code can be found here: https://github.com/goreleaser/fileglob/blob/main/prefix.go):

  • ContainsMatchers: Returns true if the pattern contains matchers and false otherwise. This is useful to determine whether the pattern directly references a file or multiple files via matchers.

  • UnquoteMeta: For patterns without matchers, return the static text represented by the pattern. This is useful to determine which file is directly referenced by a pattern that may contain escaped matchers.

Currently, using these functions in our package results in the pattern being parsed multiple times: Once for every function and then finally for the actual compilation.

Also, it would be useful to allow for AST manipulation. This could be used to inject globbing options, perform queries on the AST (like the functions above) or to extend the functionality of this library. https://github.com/antonmedv/expr uses a great pattern for this, the Patcher: https://github.com/antonmedv/expr/blob/master/docs/Visitor-and-Patch.md. In glob this could be done by passing a variadic list of function operating on the AST to the Compile function:

var containsMatchers bool

# MustCompile(string, func(rootNode ...*ast.Node))
glob.MustCompile("/foo/*", ContainsMatchers(&containsMatchers))

What do you think? If you think these ideas are not a good fit for glob you can close this issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions