diff --git a/src/Analog.Tests/FilterEvaluatorTest.fs b/src/Analog.Tests/FilterEvaluatorTest.fs
index 985087a..764acd4 100644
--- a/src/Analog.Tests/FilterEvaluatorTest.fs
+++ b/src/Analog.Tests/FilterEvaluatorTest.fs
@@ -1,4 +1,4 @@
-module FilterEvaluatorTest
+module Analog.Tests.FilterEvaluatorTest
open System
open Xunit
diff --git a/src/Analog/Analog.fsproj b/src/Analog/Analog.fsproj
index 648c82a..0a0c3d4 100644
--- a/src/Analog/Analog.fsproj
+++ b/src/Analog/Analog.fsproj
@@ -16,6 +16,7 @@
+
diff --git a/src/Analog/Program.fs b/src/Analog/Program.fs
index 24111ba..61608f2 100644
--- a/src/Analog/Program.fs
+++ b/src/Analog/Program.fs
@@ -1,7 +1,10 @@
open System
open System.IO
+open System.Text.Json
open Analog
open Argu
+open Spectre.Console
+open Spectre.Console.Json
type Argument =
| [] File of string
@@ -15,19 +18,17 @@ type Argument =
| Pattern _ -> "GROK pattern."
| Filter _ -> "Filter expression."
-let handle (args: ParseResults) =
- let text =
- args.GetResults Argument.File
- |> List.map File.ReadAllText
- |> List.reduce (fun all next -> all + next)
-
- let entries =
- args.TryGetResult Argument.Pattern
- |> Option.map EntryParser.create
- |> Option.defaultValue (EntryParser.value |> Result.Ok)
- |> Result.map (EntryParser.parse text)
-
- args.TryGetResult Argument.Filter
+let import files =
+ files |> List.map File.ReadAllText |> List.reduce (fun all next -> all + next)
+
+let parse pattern text =
+ pattern
+ |> Option.map EntryParser.create
+ |> Option.defaultValue (EntryParser.value |> Result.Ok)
+ |> Result.map (EntryParser.parse text)
+
+let filter filter entries =
+ filter
|> Option.map (ParserRunner.run FilterParser.expression)
|> Option.map (fun res ->
res
@@ -38,6 +39,27 @@ let handle (args: ParseResults) =
entries |> List.filter (fun entry -> FilterEvaluator.evaluate entry filter)))
|> Option.defaultValue entries
+let handle (args: ParseResults) =
+ import (args.GetResults Argument.File)
+ |> parse (args.TryGetResult Argument.Pattern)
+ |> filter (args.TryGetResult Argument.Filter)
+
+let normalize (entry: Entry) =
+ entry
+ |> Map.map (fun _ value ->
+ match value with
+ | String value -> box value
+ | Number value -> box value
+ | Boolean value -> box value
+ | Timestamp value -> box value)
+
+let print entries =
+ entries
+ |> List.map normalize
+ |> JsonSerializer.Serialize
+ |> JsonText
+ |> AnsiConsole.Write
+
let args =
try
ArgumentParser
@@ -48,5 +70,5 @@ let args =
Result.Error err.Message
match args |> Result.bind handle with
-| Ok entries -> entries.Length |> printf "%i"
+| Ok entries -> print entries
| Error error -> error |> eprintf "%s"