🔧 Autogenerate serialization values for wasm enums (#7296)

* 🔧 Autogenerate serialization values for wasm enums

* 🔧 Add serializer values to the wasm api

*  Avoid converting to a clojure map the serializer js object

* 🔧 Update watch script for autoserialized enums

* 🐛 Fix missing serializer values
This commit is contained in:
Belén Albeza
2025-09-16 12:29:14 +02:00
committed by GitHub
parent 01e963ae35
commit e5e11b6383
26 changed files with 592 additions and 304 deletions

View File

@@ -1072,10 +1072,35 @@
(let [uri (cf/resolve-static-asset "js/render_wasm.js")]
(->> (js/dynamicImport (str uri))
(p/mcat (fn [module]
(let [default (unchecked-get module "default")]
(let [default (unchecked-get module "default")
serializers #js{:blur-type (unchecked-get module "BlurType")
:bool-type (unchecked-get module "BoolType")
:font-style (unchecked-get module "FontStyle")
:flex-direction (unchecked-get module "FlexDirection")
:grid-direction (unchecked-get module "GridDirection")
:grow-type (unchecked-get module "GrowType")
:align-items (unchecked-get module "AlignItems")
:align-self (unchecked-get module "AlignSelf")
:align-content (unchecked-get module "AlignContent")
:justify-items (unchecked-get module "JustifyItems")
:justify-content (unchecked-get module "JustifyContent")
:justify-self (unchecked-get module "JustifySelf")
:wrap-type (unchecked-get module "WrapType")
:grid-track-type (unchecked-get module "GridTrackType")
:shadow-style (unchecked-get module "ShadowStyle")
:stroke-style (unchecked-get module "StrokeStyle")
:stroke-cap (unchecked-get module "StrokeCap")
:shape-type (unchecked-get module "Type")
:constraint-h (unchecked-get module "ConstraintH")
:constraint-v (unchecked-get module "ConstraintV")
:sizing (unchecked-get module "Sizing")
:vertical-align (unchecked-get module "VerticalAlign")
:fill-data (unchecked-get module "RawFillData")
:segment-data (unchecked-get module "RawSegmentData")}]
(set! wasm/serializers serializers)
(default))))
(p/fmap (fn [module]
(set! wasm/internal-module module)
(p/fmap (fn [default]
(set! wasm/internal-module default)
true))
(p/merr (fn [cause]
(js/console.error cause)

View File

@@ -4,10 +4,12 @@
;;
;; Copyright (c) KALEIDOS INC
(ns app.render-wasm.serializers
(:require
[app.common.uuid :as uuid]
[cuerdas.core :as str]))
(ns app.render-wasm.serializers
(:require
[app.common.data :as d]
[app.common.uuid :as uuid]
[app.render-wasm.wasm :as wasm]
[cuerdas.core :as str]))
(defn u8
[value]
@@ -56,37 +58,21 @@
(defn translate-shape-type
[type]
(case type
:frame 0
:group 1
:bool 2
:rect 3
:path 4
:text 5
:circle 6
:svg-raw 7
:image 8))
(let [values (unchecked-get wasm/serializers "shape-type")
default (unchecked-get values "rect")]
(d/nilv (unchecked-get values (d/name type)) default)))
(defn translate-stroke-style
[stroke-style]
(case stroke-style
:dotted 1
:dashed 2
:mixed 3
0))
(let [values (unchecked-get wasm/serializers "stroke-style")
default (unchecked-get values "solid")]
(d/nilv (unchecked-get values (d/name stroke-style)) default)))
(defn translate-stroke-cap
[stroke-cap]
(case stroke-cap
:line-arrow 1
:triangle-arrow 2
:square-marker 3
:circle-marker 4
:diamond-marker 5
:round 6
:square 7
0))
(let [values (unchecked-get wasm/serializers "stroke-cap")
default (unchecked-get values "none")]
(d/nilv (unchecked-get values (d/name stroke-cap)) default)))
(defn serialize-path-attrs
[svg-attrs]
@@ -120,143 +106,99 @@
(defn translate-constraint-h
[type]
(case type
:left 0
:right 1
:leftright 2
:center 3
:scale 4))
(let [values (unchecked-get wasm/serializers "constraint-h")
default 5] ;; TODO: fix code in rust so we have a proper None variant
(d/nilv (unchecked-get values (d/name type)) default)))
(defn translate-constraint-v
[type]
(case type
:top 0
:bottom 1
:topbottom 2
:center 3
:scale 4))
(let [values (unchecked-get wasm/serializers "constraint-v")
default 5] ;; TODO: fix code in rust so we have a proper None variant
(d/nilv (unchecked-get values (d/name type)) default)))
(defn translate-bool-type
[bool-type]
(case bool-type
:union 0
:difference 1
:intersection 2
:exclude 3
0))
(let [values (unchecked-get wasm/serializers "bool-type")
default (unchecked-get values "union")]
(d/nilv (unchecked-get values (d/name bool-type)) default)))
(defn translate-blur-type
[blur-type]
(case blur-type
:layer-blur 1
0))
(let [values (unchecked-get wasm/serializers "blur-type")
default (unchecked-get values "none")]
(d/nilv (unchecked-get values (d/name blur-type)) default)))
(defn translate-layout-flex-dir
[flex-dir]
(case flex-dir
:row 0
:row-reverse 1
:column 2
:column-reverse 3))
(let [values (unchecked-get wasm/serializers "flex-direction")]
(unchecked-get values (d/name flex-dir))))
(defn translate-layout-grid-dir
[flex-dir]
(case flex-dir
:row 0
:column 1))
[grid-dir]
(let [values (unchecked-get wasm/serializers "grid-direction")]
(unchecked-get values (d/name grid-dir))))
(defn translate-layout-align-items
[align-items]
(case align-items
:start 0
:end 1
:center 2
:stretch 3
0))
(let [values (unchecked-get wasm/serializers "align-items")
default (unchecked-get values "start")]
(d/nilv (unchecked-get values (d/name align-items)) default)))
(defn translate-layout-align-content
[align-content]
(case align-content
:start 0
:end 1
:center 2
:space-between 3
:space-around 4
:space-evenly 5
:stretch 6
6))
(let [values (unchecked-get wasm/serializers "align-content")
default (unchecked-get values "stretch")]
(d/nilv (unchecked-get values (d/name align-content)) default)))
(defn translate-layout-justify-items
[justify-items]
(case justify-items
:start 0
:end 1
:center 2
:stretch 3
0))
(let [values (unchecked-get wasm/serializers "justify-items")
default (unchecked-get values "start")]
(d/nilv (unchecked-get values (d/name justify-items)) default)))
(defn translate-layout-justify-content
[justify-content]
(case justify-content
:start 0
:end 1
:center 2
:space-between 3
:space-around 4
:space-evenly 5
:stretch 6
6))
(let [values (unchecked-get wasm/serializers "justify-content")
default (unchecked-get values "stretch")]
(d/nilv (unchecked-get values (d/name justify-content)) default)))
(defn translate-layout-wrap-type
[wrap-type]
(case wrap-type
:wrap 0
:nowrap 1
1))
(let [values (unchecked-get wasm/serializers "wrap-type")
default (unchecked-get values "nowrap")]
(d/nilv (unchecked-get values (d/name wrap-type)) default)))
(defn translate-grid-track-type
[type]
(case type
:percent 0
:flex 1
:auto 2
:fixed 3))
(let [values (unchecked-get wasm/serializers "grid-track-type")]
(unchecked-get values (d/name type))))
(defn translate-layout-sizing
[value]
(case value
:fill 0
:fix 1
:auto 2
1))
[sizing]
(let [values (unchecked-get wasm/serializers "sizing")
default (unchecked-get values "fix")]
(d/nilv (unchecked-get values (d/name sizing)) default)))
(defn translate-align-self
[value]
(when value
(case value
:auto 0
:start 1
:end 2
:center 3
:stretch 4)))
[align-self]
(let [values (unchecked-get wasm/serializers "align-self")]
(unchecked-get values (d/name align-self))))
(defn translate-justify-self
[value]
(when value
(case value
:auto 0
:start 1
:end 2
:center 3
:stretch 4)))
[justify-self]
(let [values (unchecked-get wasm/serializers "justify-self")]
(unchecked-get values (d/name justify-self))))
(defn translate-shadow-style
[style]
(case style
:drop-shadow 0
:inner-shadow 1
0))
(let [values (unchecked-get wasm/serializers "shadow-style")
default (unchecked-get values "drop-shadow")]
(d/nilv (unchecked-get values (d/name style)) default)))
;; TODO: Find/Create a Rust enum for this
(defn translate-structure-modifier-type
[type]
(case type
@@ -266,19 +208,17 @@
(defn translate-grow-type
[grow-type]
(case grow-type
:auto-width 1
:auto-height 2
0))
(let [values (unchecked-get wasm/serializers "grow-type")
default (unchecked-get values "fixed")]
(d/nilv (unchecked-get values (d/name grow-type)) default)))
(defn translate-vertical-align
[vertical-align]
(case vertical-align
"top" 0
"center" 1
"bottom" 2
0))
(let [values (unchecked-get wasm/serializers "vertical-align")
default (unchecked-get values "top")]
(d/nilv (unchecked-get values (d/name vertical-align)) default)))
;; TODO: Find/Create a Rust enum for this
(defn translate-text-align
[text-align]
(case text-align
@@ -288,6 +228,7 @@
"justify" 3
0))
;; TODO: Find/Create a Rust enum for this
(defn translate-text-transform
[text-transform]
(case text-transform
@@ -298,6 +239,7 @@
nil 0
0))
;; TODO: Find/Create a Rust enum for this
(defn translate-text-decoration
[text-decoration]
(case text-decoration
@@ -308,6 +250,7 @@
nil 0
0))
;; TODO: Find/Create a Rust enum for this
(defn translate-text-direction
[text-direction]
(case text-direction
@@ -318,8 +261,12 @@
(defn translate-font-style
[font-style]
(case font-style
"normal" 0
"regular" 0
"italic" 1
0))
(let [values (unchecked-get wasm/serializers "font-style")
default (unchecked-get values "normal")]
(case font-style
;; NOTE: normal == regular!
;; is it OK to keep those two values in our cljs model?
"normal" (unchecked-get values "normal")
"regular" (unchecked-get values "normal")
"italic" (unchecked-get values "italic")
default)))

View File

@@ -1,4 +1,5 @@
(ns app.render-wasm.wasm)
(defonce internal-frame-id nil)
(defonce internal-module #js {})
(defonce internal-module #js {})
(defonce serializers #js {})