-
Notifications
You must be signed in to change notification settings - Fork 4
/
Main.scala
73 lines (62 loc) · 1.98 KB
/
Main.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package webapp
import outwatch._
import outwatch.dsl._
import cats.effect.SyncIO
import formidable._
case class Person(name: String, age: Int = 5)
sealed trait Pet
object Pet {
case class Dog(name: String, @formidable.Label("Hungry?") hungry: Boolean = true) extends Pet
@formidable.Default
case class Cat(name: String, legs: Int = 4) extends Pet
}
case class Tree(value: Int = 2, children: Seq[Tree])
sealed trait BinaryTree
object BinaryTree {
@formidable.Default
@formidable.Label("Leaf Node")
case class Leaf(value: Int) extends BinaryTree
@formidable.Label("Branch Node")
case class Branch(left: BinaryTree, right: BinaryTree) extends BinaryTree
}
sealed trait GenericLinkedList[+T]
object GenericLinkedList {
case class Cons[+T](head: T, tail: GenericLinkedList[T]) extends GenericLinkedList[T]
@formidable.Default
case object Nil extends GenericLinkedList[Nothing]
}
object Main extends Extras {
def main(args: Array[String]): Unit =
Outwatch.renderInto[SyncIO]("#app", app).unsafeRunSync()
def app: VNode = {
div(
formFrame[String]("String"),
formFrame[Int]("Int"),
formFrame[Double]("Double"),
formFrame[Long]("Long"),
formFrame[Boolean]("Boolean"),
formFrame[Option[Int]]("Option[Int]"),
formFrame[Seq[Int]]("Seq[Int]"),
formFrame[List[Int]]("List[Int]"),
formFrame[Vector[Int]]("Vector[Int]"),
formFrame[(Int, String, Option[Long])]("Tuple"),
formFrame[Person]("Person"),
formFrame[Pet]("Pet"),
formFrame[Tree]("Tree"),
formFrame[BinaryTree]("BinaryTree"),
formFrame[GenericLinkedList[Pet]]("GenericLinkedList[Pet]"),
)
}
def formFrame[T: Form](name: String): VMod = {
val state = Form.state[T]
div(
cls := name,
marginBottom := "5px",
padding := "5px",
border := "1px solid black",
div(i(name)),
Form[T].render(state),
div("value: ", span(cls := "value", state.map(_.toString))),
): VMod
}
}