Skip to content
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
1 change: 1 addition & 0 deletions frontend-laminar/src/main/resources/index-fullopt.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<meta charset="UTF-8">
<title>[FULL] json-log-viewer</title>
<link rel="stylesheet" href="./app.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-opt/main.js"></script>
</head>
<body>
Expand Down
27 changes: 25 additions & 2 deletions frontend-laminar/src/main/scala/App.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.scalajs.dom
import org.scalajs.dom.HTMLButtonElement
import org.scalajs.dom.HTMLDivElement
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Json
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Logfmt
import ru.d10xa.jsonlogviewer.decline.Config
Expand Down Expand Up @@ -49,6 +50,9 @@ object App {
val formatInVar: Var[FormatIn] = Var(
FormatIn.Json
)
val formatOutVar: Var[FormatOut] = Var(
FormatOut.Pretty
)

val splitPattern: Regex = "([^\"]\\S*|\".+?\")\\s*".r
def splitArgs(s: String): Seq[String] =
Expand All @@ -61,12 +65,13 @@ object App {
cli <- cliVar.signal
filterString <- filterVar.signal
formatIn <- formatInVar.signal
formatOut <- formatOutVar.signal
filter = QueryCompiler(filterString) match
case Left(value) => None
case Right(value) => Some(value)
} yield DeclineOpts.command
.parse(splitArgs(cli))
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn)))
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn), formatOut = Some(formatOut)))

def main(args: Array[String]): Unit = {
lazy val container = dom.document.getElementById("app-container")
Expand Down Expand Up @@ -125,6 +130,22 @@ object App {
option(value := "logfmt", "logfmt")
)
)
def formatOutDiv: ReactiveHtmlElement[HTMLDivElement] = div(
label("--format-out", cls := "col-2"),
select(
cls := "col-1",
value <-- formatOutVar.signal.map {
case FormatOut.Raw => "raw"
case FormatOut.Pretty => "pretty"
},
onChange.mapToValue.map {
case "raw" => FormatOut.Raw
case "pretty" => FormatOut.Pretty
} --> formatOutVar,
option(value := "pretty", "pretty"),
option(value := "raw", "raw")
)
)

def filterDiv: ReactiveHtmlElement[HTMLDivElement] = div(
cls := "row-fluid",
Expand All @@ -137,7 +158,7 @@ object App {
onInput.mapToValue --> filterVar
)
)
)
)

def additionalArgsDiv: ReactiveHtmlElement[HTMLDivElement] = div(
cls := "row-fluid",
Expand Down Expand Up @@ -174,6 +195,7 @@ object App {
private def renderLivePage(): HtmlElement = {
div(
formatInDiv,
formatOutDiv,
filterDiv,
additionalArgsDiv,
buttonGenerateLogs,
Expand All @@ -197,6 +219,7 @@ object App {
private def renderEditPage(): HtmlElement = {
div(
formatInDiv,
formatOutDiv,
filterDiv,
additionalArgsDiv,
buttonGenerateLogs,
Expand Down
4 changes: 2 additions & 2 deletions frontend-laminar/src/main/scala/ViewElement.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import ru.d10xa.jsonlogviewer.JsonDetector
import ru.d10xa.jsonlogviewer.JsonPrefixPostfix
import ru.d10xa.jsonlogviewer.JsonLogLineParser
import ru.d10xa.jsonlogviewer.TimestampFilter
import ru.d10xa.jsonlogviewer.ColorLineFormatter
import ru.d10xa.jsonlogviewer.LogViewerStream
import ru.d10xa.jsonlogviewer.LogLineFilter
import fs2.*
Expand All @@ -18,6 +17,7 @@ import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.decline.TimestampConfig
import ru.d10xa.jsonlogviewer.decline.TimestampConfig
import ru.d10xa.jsonlogviewer.formatout.ColorLineFormatter
import ru.d10xa.jsonlogviewer.logfmt.LogfmtLogLineParser

import scala.util.chaining.scalaUtilChainingOps
Expand Down Expand Up @@ -55,7 +55,7 @@ object ViewElement {
configSignal: Signal[Either[Help, Config]]
): HtmlElement =
pre(
cls := "bg-dark font-monospace",
cls := "bg-dark font-monospace text-white",
child <-- runApp(logLinesSignal, configSignal)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ru.d10xa.jsonlogviewer.decline.DeclineOpts
import ru.d10xa.jsonlogviewer.logfmt.LogfmtLogLineParser
import _root_.io.circe.yaml.scalayaml.parser
import cats.syntax.all.*
import ru.d10xa.jsonlogviewer.decline.ConfigInit
import ru.d10xa.jsonlogviewer.decline.ConfigInitImpl
import ru.d10xa.jsonlogviewer.decline.ConfigYaml

Expand All @@ -26,8 +27,10 @@ object Application
.repartition(s => Chunk.array(s.split("\n", -1)))
.filter(_.nonEmpty)

private val configInit: ConfigInit = new ConfigInitImpl

def main: Opts[IO[ExitCode]] = DeclineOpts.config.map { c =>
new ConfigInitImpl().initConfig(c).flatMap { updatedConfig =>
configInit.initConfig(c).flatMap { updatedConfig =>
IO {
val jsonPrefixPostfix = JsonPrefixPostfix(JsonDetector())
val logLineParser = updatedConfig.formatIn match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package ru.d10xa.jsonlogviewer
import fs2.*
import fs2.io.*
import ru.d10xa.jsonlogviewer.decline.Config
import ru.d10xa.jsonlogviewer.formatout.ColorLineFormatter
import ru.d10xa.jsonlogviewer.formatout.RawFormatter
object LogViewerStream {

def stream[F[_]](
config: Config,
logLineParser: LogLineParser
): Pipe[F, String, String] = stream =>
val timestampFilter = TimestampFilter()
val outputLineFormatter = ColorLineFormatter(config)
val outputLineFormatter = config.formatOut match
case Some(Config.FormatOut.Raw) => RawFormatter()
case Some(Config.FormatOut.Pretty) | None => ColorLineFormatter(config)

val parseResultKeys = ParseResultKeys(config)
val logLineFilter = LogLineFilter(config, parseResultKeys)
stream
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@ final case class Config(
timestamp: TimestampConfig,
grep: List[ConfigGrep],
filter: Option[QueryAST],
formatIn: Option[Config.FormatIn]
formatIn: Option[Config.FormatIn],
formatOut: Option[Config.FormatOut],
)

object Config:
final case class ConfigGrep(key: String, value: Regex)

enum FormatIn:
case Json, Logfmt

enum FormatOut:
case Pretty, Raw

end Config
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.monovore.decline.Opts
import com.monovore.decline.time.*
import ru.d10xa.jsonlogviewer.decline.Config.ConfigGrep
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
import ru.d10xa.jsonlogviewer.query.QueryAST
import ru.d10xa.jsonlogviewer.query.QueryCompiler

Expand Down Expand Up @@ -46,6 +47,11 @@ object DeclineOpts {
.option[String]("format-in", help = "json, logfmt")
.mapValidated(FormatInValidator.toValidatedFormatIn)
.orNone

val formatOut: Opts[Option[FormatOut]] = Opts
.option[String]("format-out", help = "pretty, raw")
.mapValidated(FormatOutValidator.toValidatedFormatOut)
.orNone

def timestampConfig: Opts[TimestampConfig] =
(timestampField, timestampAfter, timestampBefore)
Expand All @@ -57,7 +63,7 @@ object DeclineOpts {
.orNone

val config: Opts[Config] =
(configFile, timestampConfig, grepConfig, filterConfig, formatIn)
(configFile, timestampConfig, grepConfig, filterConfig, formatIn, formatOut)
.mapN(Config.apply)

val command: Command[Config] = Command(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.d10xa.jsonlogviewer.decline

import cats.data.NonEmptyList
import cats.data.Validated
import cats.data.ValidatedNel
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut

object FormatOutValidator {
def toValidatedFormatOut(
str: String
): Validated[NonEmptyList[String], FormatOut] = str match
case "pretty" => Validated.valid(FormatOut.Pretty)
case "raw" => Validated.valid(FormatOut.Raw)
case other => Validated.invalidNel(s"Wrong format: $other")
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package ru.d10xa.jsonlogviewer
package ru.d10xa.jsonlogviewer.formatout

import fansi.ErrorMode.Strip
import fansi.EscapeAttr
import fansi.Str
import ru.d10xa.jsonlogviewer.OutputLineFormatter
import ru.d10xa.jsonlogviewer.ParseResult
import ru.d10xa.jsonlogviewer.decline.Config

class ColorLineFormatter(c: Config) extends OutputLineFormatter:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.d10xa.jsonlogviewer.formatout

import fansi.ErrorMode.Strip
import fansi.EscapeAttr
import fansi.Str
import ru.d10xa.jsonlogviewer.OutputLineFormatter
import ru.d10xa.jsonlogviewer.ParseResult
import ru.d10xa.jsonlogviewer.decline.Config

class RawFormatter extends OutputLineFormatter:
override def formatLine(p: ParseResult): Str =
p.raw
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ class LogLineQueryPredicateImplTest extends munit.FunSuite {
),
grep = List.empty,
filter = None,
formatIn = None
formatIn = None,
formatOut = None
)

private lazy val parseResultKeys = new ParseResultKeys(config = config)
Expand Down