Skip to content

Commit a262f7b

Browse files
committed
WIP
1 parent 193901d commit a262f7b

File tree

10 files changed

+209
-91
lines changed

10 files changed

+209
-91
lines changed

workflow-trace-viewer/api/workflow-trace-viewer.api

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,14 @@ public final class com/squareup/workflow1/traceviewer/MainKt {
1414
public static synthetic fun main ([Ljava/lang/String;)V
1515
}
1616

17-
public final class com/squareup/workflow1/traceviewer/model/Node {
17+
public final class com/squareup/workflow1/traceviewer/SandboxState {
1818
public static final field $stable I
19-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/List;)V
20-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
21-
public fun equals (Ljava/lang/Object;)Z
22-
public final fun getChildren ()Ljava/util/List;
23-
public final fun getId ()Ljava/lang/String;
24-
public final fun getName ()Ljava/lang/String;
25-
public final fun getParent ()Ljava/lang/String;
26-
public final fun getParentId ()Ljava/lang/String;
27-
public final fun getProps ()Ljava/lang/Object;
28-
public final fun getRenderings ()Ljava/lang/Object;
29-
public final fun getState ()Ljava/lang/Object;
30-
public fun hashCode ()I
31-
public fun toString ()Ljava/lang/String;
32-
}
33-
34-
public final class com/squareup/workflow1/traceviewer/ui/FrameSelectTabKt {
35-
public static final fun FrameSelectTab (Ljava/util/List;ILkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
36-
}
37-
38-
public final class com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanelKt {
39-
public static final fun RightInfoPanel (Lcom/squareup/workflow1/traceviewer/model/Node;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
40-
}
41-
42-
public final class com/squareup/workflow1/traceviewer/ui/WorkflowTreeKt {
43-
public static final fun RenderDiagram (Lio/github/vinceglb/filekit/PlatformFile;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
19+
public fun <init> ()V
20+
public final fun getOffset-F1C5BW0 ()J
21+
public final fun getScale ()F
22+
public final fun reset ()V
23+
public final fun setOffset-k-4lQ0M (J)V
24+
public final fun setScale (F)V
4425
}
4526

4627
public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt {
@@ -50,28 +31,8 @@ public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$
5031
public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3;
5132
}
5233

53-
public final class com/squareup/workflow1/traceviewer/util/JsonParserKt {
54-
public static final field ROOT_ID Ljava/lang/String;
55-
public static final fun parseTrace (Lio/github/vinceglb/filekit/PlatformFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
56-
}
57-
58-
public abstract interface class com/squareup/workflow1/traceviewer/util/ParseResult {
59-
}
60-
61-
public final class com/squareup/workflow1/traceviewer/util/ParseResult$Failure : com/squareup/workflow1/traceviewer/util/ParseResult {
62-
public static final field $stable I
63-
public fun <init> (Ljava/lang/Throwable;)V
64-
public final fun getError ()Ljava/lang/Throwable;
65-
}
66-
67-
public final class com/squareup/workflow1/traceviewer/util/ParseResult$Success : com/squareup/workflow1/traceviewer/util/ParseResult {
68-
public static final field $stable I
69-
public fun <init> (Ljava/util/List;)V
70-
public final fun getTrace ()Ljava/util/List;
71-
}
72-
7334
public final class com/squareup/workflow1/traceviewer/util/SandboxBackgroundKt {
74-
public static final fun SandboxBackground (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
35+
public static final fun SandboxBackground (Lcom/squareup/workflow1/traceviewer/SandboxState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
7536
}
7637

7738
public final class com/squareup/workflow1/traceviewer/util/UploadFileKt {

workflow-trace-viewer/build.gradle.kts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ kotlin {
2727
implementation(libs.filekit.dialogs.compose)
2828
}
2929
}
30+
31+
jvmTest {
32+
dependencies {
33+
implementation(kotlin("test"))
34+
implementation(kotlin("test-junit5"))
35+
implementation("org.junit.jupiter:junit-jupiter:5.9.2")
36+
}
37+
}
3038
}
3139
}
3240

@@ -50,3 +58,10 @@ compose {
5058
}
5159
}
5260
}
61+
62+
tasks.named<Test>("jvmTest") {
63+
useJUnitPlatform()
64+
testLogging {
65+
events("passed", "skipped", "failed")
66+
}
67+
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public fun App(
7979
}
8080
}
8181

82-
class SandboxState {
82+
internal class SandboxState {
8383
var offset by mutableStateOf(Offset.Zero)
8484
var scale by mutableStateOf(1f)
8585

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,27 @@ package com.squareup.workflow1.traceviewer.model
77
*
88
* TBD what more metadata should be involved with each node, e.g. (props, states, # of render passes)
99
*/
10-
public class Node(
10+
internal data class Node(
1111
val name: String,
12+
val id: String,
1213
val parent: String,
13-
val props: Any? = null,
14-
val state: Any? = null,
15-
val renderings: Any? = null,
16-
val children: MutableList<Node>,
17-
val id: String
14+
val parentId: String,
15+
val props: String,
16+
val state: String,
17+
val rendering: String = "",
18+
val children: List<Node>,
1819
) {
1920

2021
fun copy(): Node {
2122
return Node(
2223
name = name,
24+
id = id,
2325
parent = parent,
26+
parentId = parentId,
2427
props = props,
2528
state = state,
2629
rendering = rendering,
27-
children = children.map { it.copy() }.toMutableList(),
28-
id = id
30+
children = children,
2931
)
3032
}
3133

@@ -43,3 +45,11 @@ public class Node(
4345
return id.hashCode()
4446
}
4547
}
48+
49+
internal fun Node.addChild(child: Node): Node {
50+
return copy( children = this.children + child )
51+
}
52+
53+
internal fun Node.replaceChild(child: Node): Node {
54+
return copy(children = this.children.map { if (it.id == child.id) child else it })
55+
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import com.squareup.workflow1.traceviewer.model.Node
1818
* A trace tab selector that allows devs to switch between different states within the provided trace.
1919
*/
2020
@Composable
21-
public fun FrameSelectTab(
21+
internal fun FrameSelectTab(
2222
frames: List<Node>,
2323
currentIndex: Int,
2424
onIndexChange: (Int) -> Unit,

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import com.squareup.workflow1.traceviewer.model.Node
3636
* @param selectedNode The currently selected workflow node, or null if no node is selected.
3737
*/
3838
@Composable
39-
public fun RightInfoPanel(
39+
internal fun RightInfoPanel(
4040
selectedNode: Node?,
4141
modifier: Modifier = Modifier
4242
) {

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import io.github.vinceglb.filekit.PlatformFile
2929
* tabs. This will also all errors related to errors parsing a given trace JSON file.
3030
*/
3131
@Composable
32-
public fun RenderDiagram(
32+
internal fun RenderDiagram(
3333
traceFile: PlatformFile,
3434
frameInd: Int,
3535
onFileParse: (List<Node>) -> Unit,
@@ -51,7 +51,7 @@ public fun RenderDiagram(
5151
is ParseResult.Success -> {
5252
val parsedFrames = parseResult.trace ?: emptyList()
5353
frames = parsedFrames
54-
mainTree = parseResult.mainTree
54+
mainTree = parseResult.trees.first()
5555
onFileParse(parsedFrames)
5656
isLoading = false
5757
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/JsonParser.kt

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.squareup.moshi.Moshi
55
import com.squareup.moshi.Types
66
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
77
import com.squareup.workflow1.traceviewer.model.Node
8+
import com.squareup.workflow1.traceviewer.model.addChild
9+
import com.squareup.workflow1.traceviewer.model.replaceChild
810
import io.github.vinceglb.filekit.PlatformFile
911
import io.github.vinceglb.filekit.readString
1012

@@ -21,34 +23,50 @@ const val ROOT_ID: String = "-1"
2123
* @return A [ParseResult] representing result of parsing, either an error related to the
2224
* format of the JSON, or a success and a parsed trace.
2325
*/
24-
public suspend fun parseTrace(
26+
internal suspend fun parseTrace(
2527
file: PlatformFile,
2628
): ParseResult {
27-
return try {
28-
val jsonString = file.readString()
29-
val workflowAdapter = createMoshiAdapter()
30-
val parsedRenderPasses = workflowAdapter.fromJson(jsonString)
31-
32-
var mainWorkflowTree: Node? = null
33-
val parsedFrame = mutableListOf<Node>()
34-
parsedRenderPasses?.forEach { renderPass ->
35-
val parsed = getFrameFromRenderPass(renderPass)
36-
if (mainWorkflowTree == null) {
37-
mainWorkflowTree = parsed
38-
} else {
39-
mergeFrameIntoMainTree(parsed, mainWorkflowTree!!)
40-
}
41-
parsedFrame.add(parsed)
42-
}
29+
val jsonString = file.readString()
30+
val workflowAdapter = createMoshiAdapter()
31+
val parsedRenderPasses = try {
32+
workflowAdapter.fromJson(jsonString) ?: return ParseResult.Failure(
33+
IllegalArgumentException("The provided file does not contain a valid trace.")
34+
)
4335
/*
4436
this parsing method can never be called without a provided file, so we can assume that there
4537
will always be at least one render pass in the trace. If not, then Moshi would catch any
4638
malformed JSON and throw an error beforehand.
4739
*/
48-
ParseResult.Success(parsedFrame, mainWorkflowTree!!)
4940
} catch (e: Exception) {
50-
ParseResult.Failure(e)
41+
return ParseResult.Failure(e)
42+
}
43+
44+
var mainWorkflowTree: Node? = null
45+
// var parsedTrace = mutableListOf<Node>()
46+
val frameTrees = mutableListOf<Node>()
47+
// unParsedTrace.forEach { renderPass ->
48+
// val parsed = getFrameFromRenderPass(renderPass)
49+
// if (mainWorkflowTree == null) {
50+
// mainWorkflowTree = parsed
51+
// } else {
52+
// mergeFrameIntoMainTree(parsed, mainWorkflowTree!!)
53+
// }
54+
// parsedTrace.add(parsed)
55+
// frameTrees.add(mainWorkflowTree!!.copy())
56+
// }
57+
58+
val parsedTrace = parsedRenderPasses.map { renderPass -> getFrameFromRenderPass(renderPass)}
59+
60+
parsedTrace.fold(parsedTrace[0]) { tree, frame ->
61+
// We assume that the first render pass is the main workflow tree.
62+
// val parsedFrame = getFrameFromRenderPass(unParsedRenderPass)
63+
val mergedTree = mergeFrameIntoMainTree(frame, tree)
64+
// parsedTrace.add(parsedFrame)
65+
frameTrees.add(mergedTree)
66+
mergedTree
5167
}
68+
69+
return ParseResult.Success(parsedTrace, frameTrees)
5270
}
5371

5472
/**
@@ -97,21 +115,30 @@ private fun buildTree(node: Node, childrenByParent: Map<String, List<Node>>): No
97115
* Every new frame starts with the same roots as the main tree, so we can do a simple traversal to
98116
* add any missing child nodes from the frame.
99117
*/
100-
private fun mergeFrameIntoMainTree(
118+
internal fun mergeFrameIntoMainTree(
101119
frame: Node,
102120
main: Node
103-
) {
104-
val children = frame.children
105-
children.forEach { child ->
106-
if (child in main.children) {
107-
mergeFrameIntoMainTree(child, main.children.find { it.id == child.id }!!)
108-
} else {
109-
main.children.add(child)
110-
}
121+
) : Node {
122+
if (frame.id != main.id) {
123+
throw IllegalArgumentException("Frame root ID does not match main tree root ID.")
124+
}
125+
126+
return frame.children.fold(main) { mergedTree, child ->
127+
// println(mergedTree)
128+
val parent = mergedTree.children.singleOrNull() { it.id == child.id }
129+
130+
if (parent != null) {
131+
// println("Merging child ${child.id} into parent ${parent.id}")
132+
mergedTree.replaceChild(mergeFrameIntoMainTree(child, parent))
133+
} else {
134+
// println("Adding child ${child.id} to merged tree ${mergedTree.id}")
135+
mergedTree.addChild(child)
136+
}
111137
}
138+
// println("Merged tree: $it")}
112139
}
113140

114-
sealed interface ParseResult {
115-
class Success(val trace: List<Node>?, val mainTree: Node) : ParseResult
141+
internal sealed interface ParseResult {
142+
class Success(val trace: List<Node>?, val trees: List<Node>) : ParseResult
116143
class Failure(val error: Throwable) : ParseResult
117144
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/util/SandboxBackground.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import com.squareup.workflow1.traceviewer.SandboxState
2727
*
2828
*/
2929
@Composable
30-
public fun SandboxBackground(
30+
internal fun SandboxBackground(
3131
sandboxState: SandboxState,
3232
modifier: Modifier = Modifier,
3333
content: @Composable () -> Unit,

0 commit comments

Comments
 (0)