Skip to content

improve examples #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions examples/data-prep/extism/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ func prepareRuntimeData(
// Add the request metadata to the context using the data.Provider
enrichedCtx, err := evaluator.AddDataToContext(ctx, requestMeta)
if err != nil {
logger.Error("Failed to prepare context with request data", "error", err)
return nil, fmt.Errorf("failed to prepare context: %w", err)
}

Expand All @@ -67,8 +66,7 @@ func evalAndExtractResult(
// Evaluate the script
response, err := evaluator.Eval(evalCtx)
if err != nil {
logger.Error("Failed to evaluate script", "error", err)
return nil, err
return nil, fmt.Errorf("failed to evaluate script: %w", err)
}

// Process the result
Expand All @@ -81,7 +79,6 @@ func evalAndExtractResult(
// Return the result
resultMap, ok := val.(map[string]any)
if !ok {
logger.Error("Unexpected response type", "type", fmt.Sprintf("%T", val))
return nil, fmt.Errorf("unexpected response type: %T", val)
}

Expand Down
31 changes: 4 additions & 27 deletions examples/data-prep/extism/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"context"
"log/slog"
"os"
"testing"

"github.com/robbyt/go-polyscript"
Expand Down Expand Up @@ -31,20 +30,14 @@ func getTestStaticData() map[string]any {
}

func TestDemonstrateDataPrepAndEval(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)

// Get static test data
staticData := getTestStaticData()

// Create evaluator using embedded WASM
evaluator, err := polyscript.FromExtismBytesWithData(
wasmdata.TestModule,
staticData,
logger.Handler(),
slog.Default().Handler(),
wasmdata.EntrypointGreet,
)
if err != nil {
Expand All @@ -60,14 +53,9 @@ func TestDemonstrateDataPrepAndEval(t *testing.T) {
}

func TestPrepareRuntimeData(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)

// Get static test data
staticData := getTestStaticData()
logger := slog.Default()

// Create evaluator using embedded WASM
evaluator, err := polyscript.FromExtismBytesWithData(
Expand All @@ -87,14 +75,9 @@ func TestPrepareRuntimeData(t *testing.T) {
}

func TestEvalAndExtractResult(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)

// Get static test data
staticData := getTestStaticData()
logger := slog.Default()

// Create evaluator using embedded WASM
evaluator, err := polyscript.FromExtismBytesWithData(
Expand All @@ -118,20 +101,14 @@ func TestEvalAndExtractResult(t *testing.T) {
}

func TestFromExtismFileWithData(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)

// Get static test data
staticData := getTestStaticData()

// Test FromExtismBytesWithData function
evaluator, err := polyscript.FromExtismBytesWithData(
wasmdata.TestModule,
staticData,
logger.Handler(),
slog.Default().Handler(),
wasmdata.EntrypointGreet,
)
assert.NoError(t, err, "Should create evaluator without error")
Expand Down
4 changes: 1 addition & 3 deletions examples/data-prep/risor/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ func evalAndExtractResult(
// Evaluate the script with the prepared context
result, err := evaluator.Eval(ctx)
if err != nil {
logger.Error("Script evaluation failed", "error", err)
return nil, err
return nil, fmt.Errorf("script evaluation failed: %w", err)
}

// Process the result
Expand All @@ -102,7 +101,6 @@ func evalAndExtractResult(

data, ok := val.(map[string]any)
if !ok {
logger.Error("Result is not a map", "type", fmt.Sprintf("%T", val))
return nil, fmt.Errorf("result is not a map: %T", val)
}

Expand Down
35 changes: 7 additions & 28 deletions examples/data-prep/risor/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,19 @@ package main
import (
"context"
"log/slog"
"os"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

// Helper function to create Risor evaluator - makes testing easier
func createRisorEvalHelper(t *testing.T, handler slog.Handler) (RisorEvaluator, error) {
func createRisorEvalHelper(t *testing.T, logger *slog.Logger) (RisorEvaluator, error) {
t.Helper()

// Get static test data
staticData := getTestStaticData()

// Create a logger for testing
logger := slog.New(handler.WithGroup("risor-test"))

// Create evaluator with the script and static data
return createRisorEvaluator(logger, risorScript, staticData)
}
Expand Down Expand Up @@ -47,26 +43,17 @@ func TestRun(t *testing.T) {
}

func TestCreateRisorEvaluator(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})

// Test creating evaluator
evaluator, err := createRisorEvalHelper(t, handler)
evaluator, err := createRisorEvalHelper(t, slog.Default())
require.NoError(t, err, "Should create evaluator without error")
require.NotNil(t, evaluator, "Evaluator should not be nil")
}

func TestPrepareRuntimeData(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)
logger := slog.Default()

// Create evaluator
evaluator, err := createRisorEvalHelper(t, handler)
evaluator, err := createRisorEvalHelper(t, logger)
require.NoError(t, err, "Failed to create evaluator")

// Test prepareRuntimeData function
Expand All @@ -77,14 +64,10 @@ func TestPrepareRuntimeData(t *testing.T) {
}

func TestEvalAndExtractResult(t *testing.T) {
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)
logger := slog.Default()

// Create evaluator
evaluator, err := createRisorEvalHelper(t, handler)
evaluator, err := createRisorEvalHelper(t, logger)
require.NoError(t, err, "Failed to create evaluator")

// Prepare data first
Expand All @@ -104,11 +87,7 @@ func TestEvalAndExtractResult(t *testing.T) {
// TestFullExecution tests the entire execution flow as an integration test
func TestFullExecution(t *testing.T) {
// This test mirrors the functionality in the run() function
// Create a test logger
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(handler)
logger := slog.Default()

// Get test static data
staticData := getTestStaticData()
Expand Down
7 changes: 2 additions & 5 deletions examples/data-prep/starlark/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ func prepareRuntimeData(
// Create an HTTP request object (will not make a real request!)
reqURL, err := url.Parse("http://localhost:8080/api/users?limit=10&offset=0")
if err != nil {
logger.Error("Failed to parse URL", "error", err)
return nil, err
return nil, fmt.Errorf("failed to parse URL: %w", err)
}

httpReq := &http.Request{
Expand Down Expand Up @@ -103,8 +102,7 @@ func evalAndExtractResult(
// Evaluate the script with the prepared context
result, err := evaluator.Eval(ctx)
if err != nil {
logger.Error("Script evaluation failed", "error", err)
return nil, err
return nil, fmt.Errorf("script evaluation failed: %w", err)
}

// Process the result
Expand All @@ -116,7 +114,6 @@ func evalAndExtractResult(

data, ok := val.(map[string]any)
if !ok {
logger.Error("Result is not a map", "type", fmt.Sprintf("%T", val))
return nil, fmt.Errorf("result is not a map: %T", val)
}

Expand Down
17 changes: 4 additions & 13 deletions examples/data-prep/starlark/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"context"
"log/slog"
"os"
"testing"

"github.com/stretchr/testify/assert"
Expand All @@ -26,22 +25,14 @@ func getTestStaticData() map[string]any {
}
}

// setupTestLogger creates a logger for testing
func setupTestLogger() *slog.Logger {
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
return slog.New(handler.WithGroup("starlark-test"))
}

func TestRun(t *testing.T) {
// This is a simple test of the run function
err := run()
assert.NoError(t, err, "run() should execute without error")
}

func TestCreateStarlarkEvaluator(t *testing.T) {
logger := setupTestLogger()
logger := slog.Default()
staticData := getTestStaticData()

// Test creating evaluator
Expand All @@ -56,7 +47,7 @@ func TestCreateStarlarkEvaluator(t *testing.T) {
}

func TestPrepareRuntimeData(t *testing.T) {
logger := setupTestLogger()
logger := slog.Default()
staticData := getTestStaticData()

// Create evaluator
Expand All @@ -71,7 +62,7 @@ func TestPrepareRuntimeData(t *testing.T) {
}

func TestEvalAndExtractResult(t *testing.T) {
logger := setupTestLogger()
logger := slog.Default()
staticData := getTestStaticData()

// Create evaluator
Expand Down Expand Up @@ -102,7 +93,7 @@ func TestEvalAndExtractResult(t *testing.T) {

// TestFullExecution tests the entire execution flow as an integration test
func TestFullExecution(t *testing.T) {
logger := setupTestLogger()
logger := slog.Default()
staticData := getTestStaticData()

// Create evaluator with static data
Expand Down
41 changes: 18 additions & 23 deletions examples/multiple-instantiation/extism/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,40 +17,33 @@ import (
type ExtismEvaluator = platform.Evaluator

// createEvaluator initializes an Extism evaluator with context provider for runtime data
func createEvaluator(handler slog.Handler) (ExtismEvaluator, error) {
if handler == nil {
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
func createEvaluator(logger *slog.Logger) (ExtismEvaluator, error) {
if logger == nil {
logger = slog.Default()
}
logger := slog.New(handler.WithGroup("extism-evaluator"))

// Create the evaluator using embedded WASM
// Uses the simpler interface with dynamic data only via context
evaluator, err := polyscript.FromExtismBytes(
wasmdata.TestModule,
handler,
logger.Handler(),
wasmdata.EntrypointGreet,
)
if err != nil {
logger.Error("Failed to create evaluator", "error", err)
return nil, err
return nil, fmt.Errorf("failed to create evaluator: %w", err)
}

return evaluator, nil
}

// runMultipleTimes demonstrates the "compile once, run many times" pattern with Extism
func runMultipleTimes(handler slog.Handler) ([]map[string]any, error) {
if handler == nil {
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
func runMultipleTimes(logger *slog.Logger) ([]map[string]any, error) {
if logger == nil {
logger = slog.Default()
}
logger := slog.New(handler.WithGroup("extism-multiple"))

// Create the evaluator once
evaluator, err := createEvaluator(handler)
evaluator, err := createEvaluator(logger)
if err != nil {
return nil, err
}
Expand All @@ -77,8 +70,12 @@ func runMultipleTimes(handler slog.Handler) ([]map[string]any, error) {
cancel() // Cancel the context after execution

if err != nil {
logger.Error("Evaluation failed", "error", err, "execution", i+1)
return nil, err
return nil, fmt.Errorf(
"evaluation failed for input %q (execution %d): %w",
input,
i+1,
err,
)
}

// Process result
Expand All @@ -90,8 +87,7 @@ func runMultipleTimes(handler slog.Handler) ([]map[string]any, error) {

data, ok := val.(map[string]any)
if !ok {
logger.Error("Result is not a map", "type", fmt.Sprintf("%T", val), "execution", i+1)
return nil, fmt.Errorf("result is not a map: %T", val)
return nil, fmt.Errorf("result is not a map for execution %d: %T", i+1, val)
}

results = append(results, data)
Expand All @@ -109,10 +105,9 @@ func run() error {
logger := slog.New(handler.WithGroup("extism-example"))

// Run the example
results, err := runMultipleTimes(handler)
results, err := runMultipleTimes(logger)
if err != nil {
logger.Error("Failed to run example", "error", err)
return err
return fmt.Errorf("failed to run example: %w", err)
}

// Print the results
Expand Down
Loading