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"