Skip to content

Commit

Permalink
OpenTelemetry & Parser/Eval refactoring (#184)
Browse files Browse the repository at this point in the history
  • Loading branch information
dobarx committed May 19, 2024
1 parent fb29a80 commit bd2f2e8
Show file tree
Hide file tree
Showing 139 changed files with 3,802 additions and 2,246 deletions.
124 changes: 26 additions & 98 deletions cmd/data.go
Original file line number Diff line number Diff line change
@@ -1,122 +1,59 @@
package cmd

import (
"context"
"encoding/json"
"fmt"
"log/slog"
"os"
"regexp"

"github.com/TylerBrock/colorjson"
"github.com/spf13/cobra"
"golang.org/x/exp/slices"

"github.com/blackstork-io/fabric/parser"
"github.com/blackstork-io/fabric/parser/definitions"
"github.com/blackstork-io/fabric/engine"
"github.com/blackstork-io/fabric/internal/builtin"
"github.com/blackstork-io/fabric/pkg/diagnostics"
"github.com/blackstork-io/fabric/plugin"
)

var dataTgtRe = regexp.MustCompile(`(?:document\.([^.]+)\.data\.([^.]+)\.([^.\n]+))|(?:data\.([^.]+)\.([^.]+))`)

func Data(ctx context.Context, blocks *parser.DefinedBlocks, caller *parser.Caller, target string) (result plugin.Data, diags diagnostics.Diag) {
// docName, pluginName, blockName
// target: document.<doc-name>.data.<plugin-name>.<data-name>
tgt := dataTgtRe.FindStringSubmatch(target)
if tgt == nil {
diags.Add(
"Incorrect target",
"Target should have the format 'document.<doc-name>.data.<plugin-name>.<block-name>' or 'data.<plugin-name>.<block-name>'",
)
return
}

var data *definitions.ParsedData

if tgt[1] != "" {
// document.<doc-name>.data.<plugin-name>.<block-name>
doc, found := blocks.Documents[tgt[1]]
if !found {
diags.Add(
"Document not found",
fmt.Sprintf(
"Definition for document named '%s' not found",
tgt[1],
),
)
return
}

pd, diag := blocks.ParseDocument(doc)
if diags.Extend(diag) {
return
}

idx := slices.IndexFunc(pd.Data, func(data *definitions.ParsedData) bool {
return data.PluginName == tgt[2] && data.BlockName == tgt[3]
})
if idx == -1 {
diags.Add(
"Data block not found",
fmt.Sprintf("Data block '%s.%s' not found in document '%s'", tgt[2], tgt[3], tgt[1]),
)
return
}
data = pd.Data[idx]
} else {
// data.<plugin-name>.<block-name>
defPlugin, found := blocks.Plugins[definitions.Key{
PluginKind: definitions.BlockKindData,
PluginName: tgt[4],
BlockName: tgt[5],
}]
if !found {
diags.Add(
"Data block not found",
fmt.Sprintf("Data block '%s.%s' not found in global scope", tgt[4], tgt[5]),
)
return
}
res, diag := blocks.ParsePlugin(defPlugin)
if diags.Extend(diag) {
return
}
data = (*definitions.ParsedData)(res)
}
res, diag := caller.CallData(ctx, data.PluginName, data.Config, data.Invocation)
if diags.Extend(diag) {
return
}
return res, diags
func init() {
rootCmd.AddCommand(dataCmd)
dataCmd.SetUsageTemplate(UsageTemplate(
[2]string{"TARGET", "a path to the data block to be executed. Data block must be inside of a document, so the path would look lile 'document.<doc-name>.data.<plugin-name>.<data-name>'"},
))
}

// dataCmd represents the data command
var dataCmd = &cobra.Command{
Use: "data TARGET",
Short: "Execute a single data block",
Long: `Execute the data block and print out prettified JSON to stdout`,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) (err error) {
ctx := cmd.Context()
var diags diagnostics.Diag
eval := NewEvaluator()
eng := engine.New(
engine.WithLogger(slog.Default()),
engine.WithTracer(tracer),
engine.WithBuiltIn(builtin.Plugin(version, slog.Default(), tracer)),
)
defer func() {
err = eval.Cleanup(diags)
diag := eng.Cleanup()
if diags.Extend(diag) {
err = diags
}
eng.PrintDiagnostics(os.Stderr, diags, cliArgs.colorize)
}()
diags = eval.ParseFabricFiles(os.DirFS(cliArgs.sourceDir))
if diags.HasErrors() {
return
diag := eng.ParseDir(ctx, os.DirFS(cliArgs.sourceDir))
if diags.Extend(diag) {
return diags
}
if diags.Extend(eval.LoadPluginResolver(false)) {
if diags.Extend(eng.LoadPluginResolver(ctx, false)) {
return
}
if diags.Extend(eval.LoadPluginRunner(cmd.Context())) {
if diags.Extend(eng.LoadPluginRunner(ctx)) {
return
}

res, diag := Data(cmd.Context(), eval.Blocks, eval.PluginCaller(), args[0])
res, diag := eng.FetchData(ctx, args[0])
if diags.Extend(diag) {
return
}

val := res.Any()
var ser []byte
if cliArgs.colorize {
Expand All @@ -134,13 +71,4 @@ var dataCmd = &cobra.Command{
diags.AppendErr(err, "Failed to output json data")
return
},
Args: cobra.ExactArgs(1),
}

func init() {
rootCmd.AddCommand(dataCmd)

dataCmd.SetUsageTemplate(UsageTemplate(
[2]string{"TARGET", "a path to the data block to be executed. Data block must be inside of a document, so the path would look lile 'document.<doc-name>.data.<plugin-name>.<data-name>'"},
))
}
122 changes: 0 additions & 122 deletions cmd/evaluator.go

This file was deleted.

46 changes: 29 additions & 17 deletions cmd/install.go
Original file line number Diff line number Diff line change
@@ -1,42 +1,54 @@
package cmd

import (
"log/slog"
"os"

"github.com/spf13/cobra"

"github.com/blackstork-io/fabric/engine"
"github.com/blackstork-io/fabric/internal/builtin"
"github.com/blackstork-io/fabric/pkg/diagnostics"
"github.com/blackstork-io/fabric/plugin/resolver"
)

var installUpgrade bool

func init() {
rootCmd.AddCommand(installCmd)
installCmd.Flags().BoolVarP(&installUpgrade, "upgrade", "u", false, "Upgrade plugin versions")
}

var installCmd = &cobra.Command{
Use: "install",
Short: "Install plugins",
Long: "Install Fabric plugins",
RunE: func(cmd *cobra.Command, args []string) (err error) {
ctx := cmd.Context()
var diags diagnostics.Diag
eval := NewEvaluator()
eng := engine.New(
engine.WithLogger(slog.Default()),
engine.WithTracer(tracer),
engine.WithBuiltIn(builtin.Plugin(version, slog.Default(), tracer)),
)
defer func() {
err = eval.Cleanup(diags)
diag := eng.Cleanup()
if diags.Extend(diag) {
err = diags
}
eng.PrintDiagnostics(os.Stderr, diags, cliArgs.colorize)
}()
diags = eval.ParseFabricFiles(os.DirFS(cliArgs.sourceDir))
if diags.HasErrors() {
return
diag := eng.ParseDir(ctx, os.DirFS(cliArgs.sourceDir))
if diags.Extend(diag) {
return diags
}
if diags.Extend(eval.LoadPluginResolver(true)) {
return
diag = eng.LoadPluginResolver(ctx, true)
if diags.Extend(diag) {
return diags
}
lockFile, stdDiags := eval.Resolver.Install(cmd.Context(), eval.LockFile, installUpgrade)
if diags.Extend(stdDiags) {
return
diag = eng.Install(ctx, installUpgrade)
if diags.Extend(diag) {
return diags
}
return resolver.SaveLockFileTo(defaultLockFile, lockFile)
return nil
},
}

func init() {
rootCmd.AddCommand(installCmd)
installCmd.Flags().BoolVarP(&installUpgrade, "upgrade", "u", false, "Upgrade plugin versions")
}
Loading

0 comments on commit bd2f2e8

Please sign in to comment.