Files
mautrix-telegram/pkg/gotd/telegram/query/internal/genutil/pkg.go
T
2025-06-27 20:03:37 -07:00

47 lines
1.1 KiB
Go

package genutil
import (
"context"
"go/ast"
"go/parser"
"go/token"
"os"
"github.com/go-faster/errors"
"golang.org/x/tools/go/packages"
)
func loadPackages(ctx context.Context, dir, pattern string, environ []string) ([]*packages.Package, error) {
return packages.Load(&packages.Config{
Context: ctx,
Dir: dir,
Mode: packages.NeedTypes |
packages.NeedTypesInfo |
packages.NeedTypesSizes |
packages.NeedSyntax |
packages.NeedDeps,
Env: environ,
Fset: token.NewFileSet(),
ParseFile: func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
const mode = parser.AllErrors | parser.ParseComments
return parser.ParseFile(fset, filename, src, mode)
},
}, pattern)
}
// Load loads package using given pattern.
func Load(ctx context.Context, pattern string) (*packages.Package, error) {
pkgs, err := loadPackages(ctx, "", pattern, os.Environ())
if err != nil {
return nil, errors.Wrap(err, "load packages")
}
for _, pkg := range pkgs {
if pkg.ID == pattern {
return pkg, nil
}
}
return nil, errors.Errorf("package %s not found", pattern)
}