Skip to main content

zenith_tx/schema/
fields.rs

1/// One JSON field belonging to a transaction op (excluding the `"op"` tag).
2#[derive(Debug, Clone, PartialEq)]
3pub struct OpFieldSchema {
4    /// The JSON key name for this field.
5    pub name: &'static str,
6    /// Short human/agent-readable type hint, e.g. `"node id"`, `"token ref"`,
7    /// `"string"`, `"f64"`, `"bool"`, `"enum: left|center|right"`.
8    pub ty: &'static str,
9    /// `true` when the field MUST be present; `false` when it may be omitted.
10    pub required: bool,
11}
12
13/// Return the JSON fields for a named op (excluding the `"op"` tag itself).
14///
15/// Returns an empty slice for ops that have no fields (none exist in v0, but
16/// the signature is consistent). Returns `None` if `name` is not a known op.
17pub fn op_fields(name: &str) -> Option<&'static [OpFieldSchema]> {
18    // Each arm returns a reference to a `&'static [OpFieldSchema]`.
19    // The slices are defined as `static` inside the match arms to satisfy the
20    // `'static` bound without heap allocation.
21    match name {
22        "set_text_align" => {
23            static F: &[OpFieldSchema] = &[
24                OpFieldSchema {
25                    name: "node",
26                    ty: "node id",
27                    required: true,
28                },
29                OpFieldSchema {
30                    name: "align",
31                    ty: "enum: start|center|end|justify",
32                    required: true,
33                },
34            ];
35            Some(F)
36        }
37        "move_forward" | "move_backward" | "move_to_front" | "move_to_back" | "remove_node"
38        | "detach_pattern" => {
39            static F: &[OpFieldSchema] = &[OpFieldSchema {
40                name: "node",
41                ty: "node id",
42                required: true,
43            }];
44            Some(F)
45        }
46        "set_fill" => {
47            static F: &[OpFieldSchema] = &[
48                OpFieldSchema {
49                    name: "node",
50                    ty: "node id",
51                    required: true,
52                },
53                OpFieldSchema {
54                    name: "fill",
55                    ty: "token ref",
56                    required: true,
57                },
58            ];
59            Some(F)
60        }
61        "set_stroke" => {
62            static F: &[OpFieldSchema] = &[
63                OpFieldSchema {
64                    name: "node",
65                    ty: "node id",
66                    required: true,
67                },
68                OpFieldSchema {
69                    name: "stroke",
70                    ty: "token ref",
71                    required: true,
72                },
73            ];
74            Some(F)
75        }
76        "set_stroke_width" => {
77            static F: &[OpFieldSchema] = &[
78                OpFieldSchema {
79                    name: "node",
80                    ty: "node id",
81                    required: true,
82                },
83                OpFieldSchema {
84                    name: "stroke_width",
85                    ty: "token ref",
86                    required: true,
87                },
88            ];
89            Some(F)
90        }
91        "set_visible" => {
92            static F: &[OpFieldSchema] = &[
93                OpFieldSchema {
94                    name: "node",
95                    ty: "node id",
96                    required: true,
97                },
98                OpFieldSchema {
99                    name: "visible",
100                    ty: "bool",
101                    required: true,
102                },
103            ];
104            Some(F)
105        }
106        "set_locked" => {
107            static F: &[OpFieldSchema] = &[
108                OpFieldSchema {
109                    name: "node",
110                    ty: "node id",
111                    required: true,
112                },
113                OpFieldSchema {
114                    name: "locked",
115                    ty: "bool",
116                    required: true,
117                },
118            ];
119            Some(F)
120        }
121        "set_geometry" => {
122            static F: &[OpFieldSchema] = &[
123                OpFieldSchema {
124                    name: "node",
125                    ty: "node id",
126                    required: true,
127                },
128                OpFieldSchema {
129                    name: "x",
130                    ty: "px",
131                    required: false,
132                },
133                OpFieldSchema {
134                    name: "y",
135                    ty: "px",
136                    required: false,
137                },
138                OpFieldSchema {
139                    name: "w",
140                    ty: "px",
141                    required: false,
142                },
143                OpFieldSchema {
144                    name: "h",
145                    ty: "px",
146                    required: false,
147                },
148                OpFieldSchema {
149                    name: "rotate",
150                    ty: "f64",
151                    required: false,
152                },
153            ];
154            Some(F)
155        }
156        "set_points" => {
157            static F: &[OpFieldSchema] = &[
158                OpFieldSchema {
159                    name: "node",
160                    ty: "node id",
161                    required: true,
162                },
163                OpFieldSchema {
164                    name: "points",
165                    ty: "[{x:f64,y:f64}]",
166                    required: true,
167                },
168            ];
169            Some(F)
170        }
171        "add_node" => {
172            static F: &[OpFieldSchema] = &[
173                OpFieldSchema {
174                    name: "parent",
175                    ty: "node id",
176                    required: true,
177                },
178                OpFieldSchema {
179                    name: "source",
180                    ty: ".zen fragment",
181                    required: true,
182                },
183                OpFieldSchema {
184                    name: "position",
185                    ty: r#"{at:"last"} | {at:"first"} | {at:"index",index:N} | {at:"before",id:"<sibling-id>"} | {at:"after",id:"<sibling-id>"}"#,
186                    required: false,
187                },
188            ];
189            Some(F)
190        }
191        "set_opacity" => {
192            static F: &[OpFieldSchema] = &[
193                OpFieldSchema {
194                    name: "node",
195                    ty: "node id",
196                    required: true,
197                },
198                OpFieldSchema {
199                    name: "opacity",
200                    ty: "f64",
201                    required: true,
202                },
203            ];
204            Some(F)
205        }
206        "replace_text" => {
207            static F: &[OpFieldSchema] = &[
208                OpFieldSchema {
209                    name: "node",
210                    ty: "node id",
211                    required: true,
212                },
213                OpFieldSchema {
214                    name: "spans",
215                    ty: "[{text,fill?,font_weight?,italic?,…}]",
216                    required: true,
217                },
218            ];
219            Some(F)
220        }
221        "duplicate_node" => {
222            static F: &[OpFieldSchema] = &[
223                OpFieldSchema {
224                    name: "node",
225                    ty: "node id",
226                    required: true,
227                },
228                OpFieldSchema {
229                    name: "new_id",
230                    ty: "string",
231                    required: true,
232                },
233            ];
234            Some(F)
235        }
236        "duplicate_page" => {
237            static F: &[OpFieldSchema] = &[
238                OpFieldSchema {
239                    name: "page",
240                    ty: "node id",
241                    required: true,
242                },
243                OpFieldSchema {
244                    name: "new_id",
245                    ty: "string",
246                    required: true,
247                },
248                OpFieldSchema {
249                    name: "id_suffix",
250                    ty: "string",
251                    required: true,
252                },
253            ];
254            Some(F)
255        }
256        "group" => {
257            static F: &[OpFieldSchema] = &[
258                OpFieldSchema {
259                    name: "node_ids",
260                    ty: "node-id[]",
261                    required: true,
262                },
263                OpFieldSchema {
264                    name: "group_id",
265                    ty: "string",
266                    required: true,
267                },
268            ];
269            Some(F)
270        }
271        "ungroup" => {
272            static F: &[OpFieldSchema] = &[OpFieldSchema {
273                name: "group_id",
274                ty: "node id",
275                required: true,
276            }];
277            Some(F)
278        }
279        "reparent" => {
280            static F: &[OpFieldSchema] = &[
281                OpFieldSchema {
282                    name: "node",
283                    ty: "node id",
284                    required: true,
285                },
286                OpFieldSchema {
287                    name: "new_parent",
288                    ty: "node id",
289                    required: true,
290                },
291                OpFieldSchema {
292                    name: "position",
293                    ty: r#"{at:"last"} | {at:"first"} | {at:"index",index:N} | {at:"before",id:"<sibling-id>"} | {at:"after",id:"<sibling-id>"}"#,
294                    required: false,
295                },
296            ];
297            Some(F)
298        }
299        "align_nodes" => {
300            static F: &[OpFieldSchema] = &[
301                OpFieldSchema {
302                    name: "node_ids",
303                    ty: "node-id[]",
304                    required: true,
305                },
306                OpFieldSchema {
307                    name: "align",
308                    ty: "enum: left|hcenter|right|top|vcenter|bottom",
309                    required: true,
310                },
311                OpFieldSchema {
312                    name: "anchor",
313                    ty: "string",
314                    required: false,
315                },
316            ];
317            Some(F)
318        }
319        "set_text_overflow" => {
320            static F: &[OpFieldSchema] = &[
321                OpFieldSchema {
322                    name: "node_id",
323                    ty: "node id",
324                    required: true,
325                },
326                OpFieldSchema {
327                    name: "overflow",
328                    ty: "enum: fit|clip|visible",
329                    required: true,
330                },
331            ];
332            Some(F)
333        }
334        "add_page" => {
335            static F: &[OpFieldSchema] = &[
336                OpFieldSchema {
337                    name: "id",
338                    ty: "string",
339                    required: true,
340                },
341                OpFieldSchema {
342                    name: "w",
343                    ty: "px",
344                    required: true,
345                },
346                OpFieldSchema {
347                    name: "h",
348                    ty: "px",
349                    required: true,
350                },
351                OpFieldSchema {
352                    name: "background",
353                    ty: "token ref",
354                    required: false,
355                },
356                OpFieldSchema {
357                    name: "index",
358                    ty: "i64",
359                    required: false,
360                },
361            ];
362            Some(F)
363        }
364        "delete_page" => {
365            static F: &[OpFieldSchema] = &[OpFieldSchema {
366                name: "page",
367                ty: "node id",
368                required: true,
369            }];
370            Some(F)
371        }
372        "reorder_pages" => {
373            static F: &[OpFieldSchema] = &[OpFieldSchema {
374                name: "order",
375                ty: "node-id[]",
376                required: true,
377            }];
378            Some(F)
379        }
380        "add_asset" => {
381            static F: &[OpFieldSchema] = &[
382                OpFieldSchema {
383                    name: "id",
384                    ty: "string",
385                    required: true,
386                },
387                OpFieldSchema {
388                    name: "kind",
389                    ty: "enum: image|svg|font",
390                    required: true,
391                },
392                OpFieldSchema {
393                    name: "src",
394                    ty: "string",
395                    required: true,
396                },
397                OpFieldSchema {
398                    name: "sha256",
399                    ty: "string",
400                    required: false,
401                },
402            ];
403            Some(F)
404        }
405        "set_asset" => {
406            static F: &[OpFieldSchema] = &[
407                OpFieldSchema {
408                    name: "node_id",
409                    ty: "node id",
410                    required: true,
411                },
412                OpFieldSchema {
413                    name: "asset_id",
414                    ty: "string",
415                    required: true,
416                },
417            ];
418            Some(F)
419        }
420        "distribute_nodes" => {
421            static F: &[OpFieldSchema] = &[
422                OpFieldSchema {
423                    name: "node_ids",
424                    ty: "node-id[]",
425                    required: true,
426                },
427                OpFieldSchema {
428                    name: "axis",
429                    ty: "enum: horizontal|vertical",
430                    required: true,
431                },
432            ];
433            Some(F)
434        }
435        "create_token" => {
436            static F: &[OpFieldSchema] = &[
437                OpFieldSchema {
438                    name: "id",
439                    ty: "string",
440                    required: true,
441                },
442                OpFieldSchema {
443                    name: "type",
444                    ty: "enum: color|dimension|number|fontFamily|fontWeight",
445                    required: true,
446                },
447                OpFieldSchema {
448                    name: "value",
449                    ty: "string",
450                    required: true,
451                },
452            ];
453            Some(F)
454        }
455        "update_token_value" => {
456            static F: &[OpFieldSchema] = &[
457                OpFieldSchema {
458                    name: "id",
459                    ty: "string",
460                    required: true,
461                },
462                OpFieldSchema {
463                    name: "value",
464                    ty: "string",
465                    required: true,
466                },
467            ];
468            Some(F)
469        }
470        "set_style_property" => {
471            static F: &[OpFieldSchema] = &[
472                OpFieldSchema {
473                    name: "style_id",
474                    ty: "string",
475                    required: true,
476                },
477                OpFieldSchema {
478                    name: "property",
479                    ty: "string",
480                    required: true,
481                },
482                OpFieldSchema {
483                    name: "value",
484                    ty: "token ref",
485                    required: true,
486                },
487            ];
488            Some(F)
489        }
490        "set_text_direction" => {
491            static F: &[OpFieldSchema] = &[
492                OpFieldSchema {
493                    name: "node",
494                    ty: "node id",
495                    required: true,
496                },
497                OpFieldSchema {
498                    name: "direction",
499                    ty: "enum: ltr|rtl",
500                    required: true,
501                },
502            ];
503            Some(F)
504        }
505        "find_replace_text" => {
506            static F: &[OpFieldSchema] = &[
507                OpFieldSchema {
508                    name: "find",
509                    ty: "string",
510                    required: true,
511                },
512                OpFieldSchema {
513                    name: "replace",
514                    ty: "string",
515                    required: true,
516                },
517                OpFieldSchema {
518                    name: "node",
519                    ty: "node id",
520                    required: false,
521                },
522            ];
523            Some(F)
524        }
525        "set_page_size" => {
526            static F: &[OpFieldSchema] = &[
527                OpFieldSchema {
528                    name: "page",
529                    ty: "node id",
530                    required: true,
531                },
532                OpFieldSchema {
533                    name: "w",
534                    ty: "px",
535                    required: true,
536                },
537                OpFieldSchema {
538                    name: "h",
539                    ty: "px",
540                    required: true,
541                },
542            ];
543            Some(F)
544        }
545        "align_to_edge" => {
546            static F: &[OpFieldSchema] = &[
547                OpFieldSchema {
548                    name: "node",
549                    ty: "node id",
550                    required: true,
551                },
552                OpFieldSchema {
553                    name: "edge",
554                    ty: "enum: left|right|top|bottom|hcenter|vcenter",
555                    required: true,
556                },
557                OpFieldSchema {
558                    name: "margin",
559                    ty: "f64",
560                    required: false,
561                },
562            ];
563            Some(F)
564        }
565        "create_recipe" => {
566            static F: &[OpFieldSchema] = &[
567                OpFieldSchema {
568                    name: "id",
569                    ty: "string",
570                    required: true,
571                },
572                OpFieldSchema {
573                    name: "kind",
574                    ty: "string",
575                    required: true,
576                },
577                OpFieldSchema {
578                    name: "seed",
579                    ty: "i64",
580                    required: false,
581                },
582                OpFieldSchema {
583                    name: "generator",
584                    ty: "string",
585                    required: false,
586                },
587                OpFieldSchema {
588                    name: "bounds",
589                    ty: "node id",
590                    required: false,
591                },
592                OpFieldSchema {
593                    name: "detached",
594                    ty: "bool",
595                    required: false,
596                },
597            ];
598            Some(F)
599        }
600        "update_recipe" => {
601            static F: &[OpFieldSchema] = &[
602                OpFieldSchema {
603                    name: "id",
604                    ty: "string",
605                    required: true,
606                },
607                OpFieldSchema {
608                    name: "kind",
609                    ty: "string",
610                    required: true,
611                },
612                OpFieldSchema {
613                    name: "seed",
614                    ty: "i64",
615                    required: false,
616                },
617                OpFieldSchema {
618                    name: "generator",
619                    ty: "string",
620                    required: false,
621                },
622                OpFieldSchema {
623                    name: "bounds",
624                    ty: "node id",
625                    required: false,
626                },
627                OpFieldSchema {
628                    name: "detached",
629                    ty: "bool",
630                    required: false,
631                },
632            ];
633            Some(F)
634        }
635        "delete_recipe" => {
636            static F: &[OpFieldSchema] = &[OpFieldSchema {
637                name: "id",
638                ty: "string",
639                required: true,
640            }];
641            Some(F)
642        }
643        _ => None,
644    }
645}