Skip to content

Commit 1f7ccf1

Browse files
authored
Add argument format-out (#16)
1 parent ae81b36 commit 1f7ccf1

File tree

11 files changed

+83
-10
lines changed

11 files changed

+83
-10
lines changed

frontend-laminar/src/main/resources/index-fullopt.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8">
55
<title>[FULL] json-log-viewer</title>
66
<link rel="stylesheet" href="./app.css">
7+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
78
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-opt/main.js"></script>
89
</head>
910
<body>

frontend-laminar/src/main/scala/App.scala

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.scalajs.dom
1010
import org.scalajs.dom.HTMLButtonElement
1111
import org.scalajs.dom.HTMLDivElement
1212
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
13+
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
1314
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Json
1415
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Logfmt
1516
import ru.d10xa.jsonlogviewer.decline.Config
@@ -49,6 +50,9 @@ object App {
4950
val formatInVar: Var[FormatIn] = Var(
5051
FormatIn.Json
5152
)
53+
val formatOutVar: Var[FormatOut] = Var(
54+
FormatOut.Pretty
55+
)
5256

5357
val splitPattern: Regex = "([^\"]\\S*|\".+?\")\\s*".r
5458
def splitArgs(s: String): Seq[String] =
@@ -61,12 +65,13 @@ object App {
6165
cli <- cliVar.signal
6266
filterString <- filterVar.signal
6367
formatIn <- formatInVar.signal
68+
formatOut <- formatOutVar.signal
6469
filter = QueryCompiler(filterString) match
6570
case Left(value) => None
6671
case Right(value) => Some(value)
6772
} yield DeclineOpts.command
6873
.parse(splitArgs(cli))
69-
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn)))
74+
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn), formatOut = Some(formatOut)))
7075

7176
def main(args: Array[String]): Unit = {
7277
lazy val container = dom.document.getElementById("app-container")
@@ -125,6 +130,22 @@ object App {
125130
option(value := "logfmt", "logfmt")
126131
)
127132
)
133+
def formatOutDiv: ReactiveHtmlElement[HTMLDivElement] = div(
134+
label("--format-out", cls := "col-2"),
135+
select(
136+
cls := "col-1",
137+
value <-- formatOutVar.signal.map {
138+
case FormatOut.Raw => "raw"
139+
case FormatOut.Pretty => "pretty"
140+
},
141+
onChange.mapToValue.map {
142+
case "raw" => FormatOut.Raw
143+
case "pretty" => FormatOut.Pretty
144+
} --> formatOutVar,
145+
option(value := "pretty", "pretty"),
146+
option(value := "raw", "raw")
147+
)
148+
)
128149

129150
def filterDiv: ReactiveHtmlElement[HTMLDivElement] = div(
130151
cls := "row-fluid",
@@ -137,7 +158,7 @@ object App {
137158
onInput.mapToValue --> filterVar
138159
)
139160
)
140-
)
161+
)
141162

142163
def additionalArgsDiv: ReactiveHtmlElement[HTMLDivElement] = div(
143164
cls := "row-fluid",
@@ -174,6 +195,7 @@ object App {
174195
private def renderLivePage(): HtmlElement = {
175196
div(
176197
formatInDiv,
198+
formatOutDiv,
177199
filterDiv,
178200
additionalArgsDiv,
179201
buttonGenerateLogs,
@@ -197,6 +219,7 @@ object App {
197219
private def renderEditPage(): HtmlElement = {
198220
div(
199221
formatInDiv,
222+
formatOutDiv,
200223
filterDiv,
201224
additionalArgsDiv,
202225
buttonGenerateLogs,

frontend-laminar/src/main/scala/ViewElement.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import ru.d10xa.jsonlogviewer.JsonDetector
99
import ru.d10xa.jsonlogviewer.JsonPrefixPostfix
1010
import ru.d10xa.jsonlogviewer.JsonLogLineParser
1111
import ru.d10xa.jsonlogviewer.TimestampFilter
12-
import ru.d10xa.jsonlogviewer.ColorLineFormatter
1312
import ru.d10xa.jsonlogviewer.LogViewerStream
1413
import ru.d10xa.jsonlogviewer.LogLineFilter
1514
import fs2.*
@@ -18,6 +17,7 @@ import ru.d10xa.jsonlogviewer.decline.Config
1817
import ru.d10xa.jsonlogviewer.decline.Config
1918
import ru.d10xa.jsonlogviewer.decline.TimestampConfig
2019
import ru.d10xa.jsonlogviewer.decline.TimestampConfig
20+
import ru.d10xa.jsonlogviewer.formatout.ColorLineFormatter
2121
import ru.d10xa.jsonlogviewer.logfmt.LogfmtLogLineParser
2222

2323
import scala.util.chaining.scalaUtilChainingOps
@@ -55,7 +55,7 @@ object ViewElement {
5555
configSignal: Signal[Either[Help, Config]]
5656
): HtmlElement =
5757
pre(
58-
cls := "bg-dark font-monospace",
58+
cls := "bg-dark font-monospace text-white",
5959
child <-- runApp(logLinesSignal, configSignal)
6060
)
6161

json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/Application.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import ru.d10xa.jsonlogviewer.decline.DeclineOpts
1212
import ru.d10xa.jsonlogviewer.logfmt.LogfmtLogLineParser
1313
import _root_.io.circe.yaml.scalayaml.parser
1414
import cats.syntax.all.*
15+
import ru.d10xa.jsonlogviewer.decline.ConfigInit
1516
import ru.d10xa.jsonlogviewer.decline.ConfigInitImpl
1617
import ru.d10xa.jsonlogviewer.decline.ConfigYaml
1718

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

30+
private val configInit: ConfigInit = new ConfigInitImpl
31+
2932
def main: Opts[IO[ExitCode]] = DeclineOpts.config.map { c =>
30-
new ConfigInitImpl().initConfig(c).flatMap { updatedConfig =>
33+
configInit.initConfig(c).flatMap { updatedConfig =>
3134
IO {
3235
val jsonPrefixPostfix = JsonPrefixPostfix(JsonDetector())
3336
val logLineParser = updatedConfig.formatIn match {

json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/LogViewerStream.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ package ru.d10xa.jsonlogviewer
33
import fs2.*
44
import fs2.io.*
55
import ru.d10xa.jsonlogviewer.decline.Config
6+
import ru.d10xa.jsonlogviewer.formatout.ColorLineFormatter
7+
import ru.d10xa.jsonlogviewer.formatout.RawFormatter
68
object LogViewerStream {
79

810
def stream[F[_]](
911
config: Config,
1012
logLineParser: LogLineParser
1113
): Pipe[F, String, String] = stream =>
1214
val timestampFilter = TimestampFilter()
13-
val outputLineFormatter = ColorLineFormatter(config)
15+
val outputLineFormatter = config.formatOut match
16+
case Some(Config.FormatOut.Raw) => RawFormatter()
17+
case Some(Config.FormatOut.Pretty) | None => ColorLineFormatter(config)
18+
1419
val parseResultKeys = ParseResultKeys(config)
1520
val logLineFilter = LogLineFilter(config, parseResultKeys)
1621
stream

json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/decline/Config.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ final case class Config(
1313
timestamp: TimestampConfig,
1414
grep: List[ConfigGrep],
1515
filter: Option[QueryAST],
16-
formatIn: Option[Config.FormatIn]
16+
formatIn: Option[Config.FormatIn],
17+
formatOut: Option[Config.FormatOut],
1718
)
1819

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

2223
enum FormatIn:
2324
case Json, Logfmt
25+
26+
enum FormatOut:
27+
case Pretty, Raw
2428

2529
end Config

json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/decline/DeclineOpts.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.monovore.decline.Opts
99
import com.monovore.decline.time.*
1010
import ru.d10xa.jsonlogviewer.decline.Config.ConfigGrep
1111
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
12+
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
1213
import ru.d10xa.jsonlogviewer.query.QueryAST
1314
import ru.d10xa.jsonlogviewer.query.QueryCompiler
1415

@@ -46,6 +47,11 @@ object DeclineOpts {
4647
.option[String]("format-in", help = "json, logfmt")
4748
.mapValidated(FormatInValidator.toValidatedFormatIn)
4849
.orNone
50+
51+
val formatOut: Opts[Option[FormatOut]] = Opts
52+
.option[String]("format-out", help = "pretty, raw")
53+
.mapValidated(FormatOutValidator.toValidatedFormatOut)
54+
.orNone
4955

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

5965
val config: Opts[Config] =
60-
(configFile, timestampConfig, grepConfig, filterConfig, formatIn)
66+
(configFile, timestampConfig, grepConfig, filterConfig, formatIn, formatOut)
6167
.mapN(Config.apply)
6268

6369
val command: Command[Config] = Command(
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.d10xa.jsonlogviewer.decline
2+
3+
import cats.data.NonEmptyList
4+
import cats.data.Validated
5+
import cats.data.ValidatedNel
6+
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
7+
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
8+
9+
object FormatOutValidator {
10+
def toValidatedFormatOut(
11+
str: String
12+
): Validated[NonEmptyList[String], FormatOut] = str match
13+
case "pretty" => Validated.valid(FormatOut.Pretty)
14+
case "raw" => Validated.valid(FormatOut.Raw)
15+
case other => Validated.invalidNel(s"Wrong format: $other")
16+
}

json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/ColorLineFormatter.scala renamed to json-log-viewer/shared/src/main/scala/ru/d10xa/jsonlogviewer/formatout/ColorLineFormatter.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
package ru.d10xa.jsonlogviewer
1+
package ru.d10xa.jsonlogviewer.formatout
22

33
import fansi.ErrorMode.Strip
44
import fansi.EscapeAttr
55
import fansi.Str
6+
import ru.d10xa.jsonlogviewer.OutputLineFormatter
7+
import ru.d10xa.jsonlogviewer.ParseResult
68
import ru.d10xa.jsonlogviewer.decline.Config
79

810
class ColorLineFormatter(c: Config) extends OutputLineFormatter:
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package ru.d10xa.jsonlogviewer.formatout
2+
3+
import fansi.ErrorMode.Strip
4+
import fansi.EscapeAttr
5+
import fansi.Str
6+
import ru.d10xa.jsonlogviewer.OutputLineFormatter
7+
import ru.d10xa.jsonlogviewer.ParseResult
8+
import ru.d10xa.jsonlogviewer.decline.Config
9+
10+
class RawFormatter extends OutputLineFormatter:
11+
override def formatLine(p: ParseResult): Str =
12+
p.raw

0 commit comments

Comments
 (0)