func (rt *Runtime) startRepl(ctx context.Context, params *Params) { banner := rt.getBanner() repl := repl.New(rt.Store, params.HistoryPath, params.Output, params.OutputFormat, banner) if params.Watch { watcher, err := getWatcher(params.Paths) if err != nil { fmt.Fprintln(params.Output, "error opening watch:", err) os.Exit(1) } go rt.readWatcher(ctx, watcher, params.Paths) } if params.Eval == "" { repl.Loop(ctx) } else { repl.DisableUndefinedOutput(true) repl.DisableMultiLineBuffering(true) if err := repl.OneShot(ctx, params.Eval); err != nil { fmt.Fprintln(params.Output, "error:", err) os.Exit(1) } } }
func ExampleREPL_OneShot() { // Initialize context for the example. Normally the caller would obtain the // context from an input parameter or instantiate their own. ctx := context.Background() // Instantiate the policy engine's storage layer. store := storage.New(storage.InMemoryConfig()) // Create a buffer that will receive REPL output. var buf bytes.Buffer // Create a new REPL. repl := repl.New(store, "", &buf, "json", "") // Define a rule inside the REPL. repl.OneShot(ctx, "p :- a = [1, 2, 3, 4], a[_] > 3") // Query the rule defined above. repl.OneShot(ctx, "p") // Inspect the output. Defining rules does not produce output so we only expect // output from the second line of input. fmt.Println(buf.String()) // Output: // true }