1use crate::{NodeIndex, Uri, WitNode, WitValue};
16
17pub trait WitValueBuilderExtensions {
18 fn builder() -> WitValueBuilder;
19}
20
21impl WitValueBuilderExtensions for WitValue {
22 fn builder() -> WitValueBuilder {
23 WitValueBuilder::new()
24 }
25}
26
27pub trait NodeBuilder: Sized {
28 type Result;
29
30 fn parent_builder(&mut self) -> &mut WitValueBuilder;
31
32 fn u8(self, value: u8) -> Self::Result;
33 fn u16(self, value: u16) -> Self::Result;
34 fn u32(self, value: u32) -> Self::Result;
35 fn u64(self, value: u64) -> Self::Result;
36
37 fn s8(self, value: i8) -> Self::Result;
38 fn s16(self, value: i16) -> Self::Result;
39 fn s32(self, value: i32) -> Self::Result;
40 fn s64(self, value: i64) -> Self::Result;
41
42 fn f32(self, value: f32) -> Self::Result;
43 fn f64(self, value: f64) -> Self::Result;
44
45 fn char(self, value: char) -> Self::Result;
46 fn bool(self, value: bool) -> Self::Result;
47 fn string(self, value: &str) -> Self::Result;
48 fn enum_value(self, value: u32) -> Self::Result;
49 fn flags(self, values: Vec<bool>) -> Self::Result;
50
51 fn record(self) -> WitValueChildItemsBuilder<Self>;
52 fn variant(self, case_idx: u32) -> WitValueChildBuilder<Self>;
53 fn variant_unit(self, case_idx: u32) -> Self::Result;
54
55 fn variant_fn(
57 self,
58 case_idx: u32,
59 is_unit: bool,
60 f: impl FnOnce(WitValueChildBuilder<Self>) -> Self,
61 ) -> Self::Result {
62 if is_unit {
63 self.variant_unit(case_idx)
64 } else {
65 f(self.variant(case_idx)).finish()
66 }
67 }
68
69 fn tuple(self) -> WitValueChildItemsBuilder<Self>;
70 fn list(self) -> WitValueChildItemsBuilder<Self>;
71
72 fn list_fn<T>(
73 self,
74 items: &[T],
75 f: impl Fn(&T, WitValueItemBuilder<Self>) -> WitValueChildItemsBuilder<Self>,
76 ) -> Self::Result {
77 let mut builder = self.list();
78 for item in items {
79 builder = f(item, builder.item());
80 }
81 builder.finish()
82 }
83
84 fn option_some(self) -> WitValueChildBuilder<Self>;
85 fn option_none(self) -> Self::Result;
86
87 fn option_fn(
89 self,
90 is_some: bool,
91 f: impl FnOnce(WitValueChildBuilder<Self>) -> Self,
92 ) -> Self::Result {
93 if is_some {
94 f(self.option_some()).finish()
95 } else {
96 self.option_none()
97 }
98 }
99
100 fn result_ok(self) -> WitValueChildBuilder<Self>;
101 fn result_ok_unit(self) -> Self::Result;
102 fn result_err(self) -> WitValueChildBuilder<Self>;
103 fn result_err_unit(self) -> Self::Result;
104
105 fn result_fn(
107 self,
108 is_ok: bool,
109 has_ok: bool,
110 has_err: bool,
111 f: impl FnOnce(WitValueChildBuilder<Self>) -> Self,
112 ) -> Self::Result {
113 if is_ok {
114 if has_ok {
115 f(self.result_ok()).finish()
116 } else {
117 self.result_ok_unit()
118 }
119 } else if has_err {
120 f(self.result_err()).finish()
121 } else {
122 self.result_err_unit()
123 }
124 }
125
126 fn handle(self, uri: Uri, handle_value: u64) -> Self::Result;
127
128 fn finish(self) -> Self::Result;
129}
130
131pub struct WitValueBuilder {
132 nodes: Vec<WitNode>,
133}
134
135impl WitValueBuilder {
136 pub(crate) fn new() -> Self {
137 WitValueBuilder { nodes: Vec::new() }
138 }
139
140 fn add(&mut self, node: WitNode) -> NodeIndex {
141 self.nodes.push(node);
142 self.nodes.len() as NodeIndex - 1
143 }
144
145 pub(crate) fn add_u8(&mut self, value: u8) -> NodeIndex {
146 self.add(WitNode::PrimU8(value))
147 }
148
149 pub(crate) fn add_u16(&mut self, value: u16) -> NodeIndex {
150 self.add(WitNode::PrimU16(value))
151 }
152
153 pub(crate) fn add_u32(&mut self, value: u32) -> NodeIndex {
154 self.add(WitNode::PrimU32(value))
155 }
156
157 pub(crate) fn add_u64(&mut self, value: u64) -> NodeIndex {
158 self.add(WitNode::PrimU64(value))
159 }
160
161 pub(crate) fn add_s8(&mut self, value: i8) -> NodeIndex {
162 self.add(WitNode::PrimS8(value))
163 }
164
165 pub(crate) fn add_s16(&mut self, value: i16) -> NodeIndex {
166 self.add(WitNode::PrimS16(value))
167 }
168
169 pub(crate) fn add_s32(&mut self, value: i32) -> NodeIndex {
170 self.add(WitNode::PrimS32(value))
171 }
172
173 pub(crate) fn add_s64(&mut self, value: i64) -> NodeIndex {
174 self.add(WitNode::PrimS64(value))
175 }
176
177 pub(crate) fn add_f32(&mut self, value: f32) -> NodeIndex {
178 self.add(WitNode::PrimFloat32(value))
179 }
180
181 pub(crate) fn add_f64(&mut self, value: f64) -> NodeIndex {
182 self.add(WitNode::PrimFloat64(value))
183 }
184
185 pub(crate) fn add_char(&mut self, value: char) -> NodeIndex {
186 self.add(WitNode::PrimChar(value))
187 }
188
189 pub(crate) fn add_bool(&mut self, value: bool) -> NodeIndex {
190 self.add(WitNode::PrimBool(value))
191 }
192
193 pub(crate) fn add_string(&mut self, value: &str) -> NodeIndex {
194 self.add(WitNode::PrimString(value.to_string()))
195 }
196
197 pub(crate) fn add_record(&mut self) -> NodeIndex {
198 self.add(WitNode::RecordValue(Vec::new()))
199 }
200
201 pub(crate) fn add_variant(&mut self, idx: u32, target_idx: NodeIndex) -> NodeIndex {
202 self.add(WitNode::VariantValue((idx, Some(target_idx))))
203 }
204
205 pub(crate) fn add_variant_unit(&mut self, idx: u32) -> NodeIndex {
206 self.add(WitNode::VariantValue((idx, None)))
207 }
208
209 pub(crate) fn add_enum_value(&mut self, value: u32) -> NodeIndex {
210 self.add(WitNode::EnumValue(value))
211 }
212
213 pub(crate) fn add_flags(&mut self, values: Vec<bool>) -> NodeIndex {
214 self.add(WitNode::FlagsValue(values))
215 }
216
217 pub(crate) fn add_tuple(&mut self) -> NodeIndex {
218 self.add(WitNode::TupleValue(Vec::new()))
219 }
220
221 pub(crate) fn add_list(&mut self) -> NodeIndex {
222 self.add(WitNode::ListValue(Vec::new()))
223 }
224
225 pub(crate) fn add_option_none(&mut self) -> NodeIndex {
226 self.add(WitNode::OptionValue(None))
227 }
228
229 pub(crate) fn add_option_some(&mut self) -> NodeIndex {
230 self.add(WitNode::OptionValue(Some(-1)))
231 }
232
233 pub(crate) fn add_result_ok(&mut self) -> NodeIndex {
234 self.add(WitNode::ResultValue(Ok(Some(-1))))
235 }
236
237 pub(crate) fn add_result_ok_unit(&mut self) -> NodeIndex {
238 self.add(WitNode::ResultValue(Ok(None)))
239 }
240
241 pub(crate) fn add_result_err(&mut self) -> NodeIndex {
242 self.add(WitNode::ResultValue(Err(Some(-1))))
243 }
244
245 pub(crate) fn add_result_err_unit(&mut self) -> NodeIndex {
246 self.add(WitNode::ResultValue(Err(None)))
247 }
248
249 pub(crate) fn add_handle(&mut self, uri: Uri, handle_value: u64) -> NodeIndex {
250 self.add(WitNode::Handle((uri, handle_value)))
251 }
252
253 pub(crate) fn finish_child(&mut self, child: NodeIndex, target_idx: NodeIndex) {
254 match &mut self.nodes[target_idx as usize] {
255 WitNode::OptionValue(ref mut result_item) => match result_item {
256 Some(idx) => *idx = child,
257 None => panic!("finish_child called on None option"),
258 },
259 WitNode::ResultValue(ref mut result_item) => match result_item {
260 Ok(Some(idx)) => *idx = child,
261 Ok(None) => panic!("finish_child called on Ok(None) result"),
262 Err(Some(idx)) => *idx = child,
263 Err(None) => panic!("finish_child called on Err(None) result"),
264 },
265 WitNode::VariantValue((_, ref mut result_item)) => match result_item {
266 Some(idx) => *idx = child,
267 None => panic!("finish_child called on variant with no inner value"),
268 },
269 _ => {
270 panic!(
271 "finish_child called on a node that is neither an option, result or variant"
272 );
273 }
274 }
275 }
276
277 pub(crate) fn finish_seq(&mut self, items: Vec<NodeIndex>, target_idx: NodeIndex) {
278 match &mut self.nodes[target_idx as usize] {
279 WitNode::RecordValue(ref mut result_items) => {
280 *result_items = items;
281 }
282 WitNode::TupleValue(ref mut result_items) => {
283 *result_items = items;
284 }
285 WitNode::ListValue(ref mut result_items) => {
286 *result_items = items;
287 }
288 _ => {
289 panic!("finish_seq called on a node that is neither a record, list, or tuple");
290 }
291 }
292 }
293
294 pub(crate) fn build(self) -> WitValue {
295 WitValue { nodes: self.nodes }
296 }
297}
298
299impl NodeBuilder for WitValueBuilder {
300 type Result = WitValue;
301
302 fn parent_builder(&mut self) -> &mut WitValueBuilder {
303 self
304 }
305
306 fn u8(mut self, value: u8) -> Self::Result {
307 let _ = self.add_u8(value);
308 self.build()
309 }
310
311 fn u16(mut self, value: u16) -> Self::Result {
312 let _ = self.add_u16(value);
313 self.build()
314 }
315
316 fn u32(mut self, value: u32) -> Self::Result {
317 let _ = self.add_u32(value);
318 self.build()
319 }
320
321 fn u64(mut self, value: u64) -> Self::Result {
322 let _ = self.add_u64(value);
323 self.build()
324 }
325
326 fn s8(mut self, value: i8) -> Self::Result {
327 let _ = self.add_s8(value);
328 self.build()
329 }
330
331 fn s16(mut self, value: i16) -> Self::Result {
332 let _ = self.add_s16(value);
333 self.build()
334 }
335
336 fn s32(mut self, value: i32) -> Self::Result {
337 let _ = self.add_s32(value);
338 self.build()
339 }
340
341 fn s64(mut self, value: i64) -> Self::Result {
342 let _ = self.add_s64(value);
343 self.build()
344 }
345
346 fn f32(mut self, value: f32) -> Self::Result {
347 let _ = self.add_f32(value);
348 self.build()
349 }
350
351 fn f64(mut self, value: f64) -> Self::Result {
352 let _ = self.add_f64(value);
353 self.build()
354 }
355
356 fn char(mut self, value: char) -> Self::Result {
357 let _ = self.add_char(value);
358 self.build()
359 }
360
361 fn bool(mut self, value: bool) -> Self::Result {
362 let _ = self.add_bool(value);
363 self.build()
364 }
365
366 fn string(mut self, value: &str) -> Self::Result {
367 let _ = self.add_string(value);
368 self.build()
369 }
370
371 fn enum_value(mut self, value: u32) -> Self::Result {
372 let _ = self.add_enum_value(value);
373 self.build()
374 }
375
376 fn flags(mut self, values: Vec<bool>) -> Self::Result {
377 let _ = self.add_flags(values);
378 self.build()
379 }
380
381 fn record(mut self) -> WitValueChildItemsBuilder<WitValueBuilder> {
382 let idx = self.add_record();
383 WitValueChildItemsBuilder::new(self, idx)
384 }
385
386 fn variant(mut self, case_idx: u32) -> WitValueChildBuilder<WitValueBuilder> {
387 let variant_idx = self.add_variant(case_idx, -1);
388 WitValueChildBuilder {
389 builder: self,
390 target_idx: variant_idx,
391 }
392 }
393
394 fn variant_unit(mut self, case_idx: u32) -> Self::Result {
395 let _ = self.add_variant_unit(case_idx);
396 self.build()
397 }
398
399 fn tuple(mut self) -> WitValueChildItemsBuilder<WitValueBuilder> {
400 let tuple_idx = self.add_tuple();
401 WitValueChildItemsBuilder::new(self, tuple_idx)
402 }
403
404 fn list(mut self) -> WitValueChildItemsBuilder<WitValueBuilder> {
405 let tuple_idx = self.add_list();
406 WitValueChildItemsBuilder::new(self, tuple_idx)
407 }
408
409 fn option_some(mut self) -> WitValueChildBuilder<Self> {
410 let option_idx = self.add_option_some();
411 WitValueChildBuilder {
412 builder: self,
413 target_idx: option_idx,
414 }
415 }
416
417 fn option_none(mut self) -> Self::Result {
418 let _ = self.add_option_none();
419 self.build()
420 }
421
422 fn result_ok(mut self) -> WitValueChildBuilder<Self> {
423 let result_idx = self.add_result_ok();
424 WitValueChildBuilder {
425 builder: self,
426 target_idx: result_idx,
427 }
428 }
429
430 fn result_ok_unit(mut self) -> Self::Result {
431 let _ = self.add_result_ok_unit();
432 self.build()
433 }
434
435 fn result_err(mut self) -> WitValueChildBuilder<Self> {
436 let result_idx = self.add_result_err();
437 WitValueChildBuilder {
438 builder: self,
439 target_idx: result_idx,
440 }
441 }
442
443 fn result_err_unit(mut self) -> Self::Result {
444 let _ = self.add_result_err_unit();
445 self.build()
446 }
447
448 fn handle(mut self, uri: Uri, handle_value: u64) -> Self::Result {
449 let _ = self.add_handle(uri, handle_value);
450 self.build()
451 }
452
453 fn finish(self) -> Self::Result {
454 self.build()
455 }
456}
457
458pub struct WitValueChildItemsBuilder<ParentBuilder: NodeBuilder> {
459 builder: ParentBuilder,
460 target_idx: NodeIndex,
461 items: Vec<NodeIndex>,
462}
463
464impl<ParentBuilder: NodeBuilder> WitValueChildItemsBuilder<ParentBuilder> {
465 fn new(builder: ParentBuilder, target_idx: NodeIndex) -> Self {
466 Self {
467 builder,
468 target_idx,
469 items: Vec::new(),
470 }
471 }
472
473 fn add_item(&mut self, item_type_index: i32) {
474 self.items.push(item_type_index);
475 }
476
477 pub fn item(self) -> WitValueItemBuilder<ParentBuilder> {
478 WitValueItemBuilder {
479 child_items_builder: self,
480 }
481 }
482
483 pub fn finish(mut self) -> ParentBuilder::Result {
484 self.builder
485 .parent_builder()
486 .finish_seq(self.items, self.target_idx);
487 self.builder.finish()
488 }
489}
490
491pub struct WitValueItemBuilder<ParentBuilder: NodeBuilder> {
492 child_items_builder: WitValueChildItemsBuilder<ParentBuilder>,
493}
494
495impl<ParentBuilder: NodeBuilder> NodeBuilder for WitValueItemBuilder<ParentBuilder> {
496 type Result = WitValueChildItemsBuilder<ParentBuilder>;
497
498 fn parent_builder(&mut self) -> &mut WitValueBuilder {
499 self.child_items_builder.builder.parent_builder()
500 }
501
502 fn u8(mut self, value: u8) -> Self::Result {
503 let item_type_index = self.parent_builder().add_u8(value);
504 self.child_items_builder.add_item(item_type_index);
505 self.child_items_builder
506 }
507
508 fn u16(mut self, value: u16) -> Self::Result {
509 let item_type_index = self.parent_builder().add_u16(value);
510 self.child_items_builder.add_item(item_type_index);
511 self.child_items_builder
512 }
513
514 fn u32(mut self, value: u32) -> Self::Result {
515 let item_type_index = self.parent_builder().add_u32(value);
516 self.child_items_builder.add_item(item_type_index);
517 self.child_items_builder
518 }
519
520 fn u64(mut self, value: u64) -> Self::Result {
521 let item_type_index = self.parent_builder().add_u64(value);
522 self.child_items_builder.add_item(item_type_index);
523 self.child_items_builder
524 }
525
526 fn s8(mut self, value: i8) -> Self::Result {
527 let item_type_index = self.parent_builder().add_s8(value);
528 self.child_items_builder.add_item(item_type_index);
529 self.child_items_builder
530 }
531
532 fn s16(mut self, value: i16) -> Self::Result {
533 let item_type_index = self.parent_builder().add_s16(value);
534 self.child_items_builder.add_item(item_type_index);
535 self.child_items_builder
536 }
537
538 fn s32(mut self, value: i32) -> Self::Result {
539 let item_type_index = self.parent_builder().add_s32(value);
540 self.child_items_builder.add_item(item_type_index);
541 self.child_items_builder
542 }
543
544 fn s64(mut self, value: i64) -> Self::Result {
545 let item_type_index = self.parent_builder().add_s64(value);
546 self.child_items_builder.add_item(item_type_index);
547 self.child_items_builder
548 }
549
550 fn f32(mut self, value: f32) -> Self::Result {
551 let item_type_index = self.parent_builder().add_f32(value);
552 self.child_items_builder.add_item(item_type_index);
553 self.child_items_builder
554 }
555
556 fn f64(mut self, value: f64) -> Self::Result {
557 let item_type_index = self.parent_builder().add_f64(value);
558 self.child_items_builder.add_item(item_type_index);
559 self.child_items_builder
560 }
561
562 fn char(mut self, value: char) -> Self::Result {
563 let item_type_index = self.parent_builder().add_char(value);
564 self.child_items_builder.add_item(item_type_index);
565 self.child_items_builder
566 }
567
568 fn bool(mut self, value: bool) -> Self::Result {
569 let item_type_index = self.parent_builder().add_bool(value);
570 self.child_items_builder.add_item(item_type_index);
571 self.child_items_builder
572 }
573
574 fn string(mut self, value: &str) -> Self::Result {
575 let item_type_index = self.parent_builder().add_string(value);
576 self.child_items_builder.add_item(item_type_index);
577 self.child_items_builder
578 }
579
580 fn enum_value(mut self, value: u32) -> Self::Result {
581 let item_type_index = self.parent_builder().add_enum_value(value);
582 self.child_items_builder.add_item(item_type_index);
583 self.child_items_builder
584 }
585
586 fn flags(mut self, values: Vec<bool>) -> Self::Result {
587 let item_type_index = self.parent_builder().add_flags(values);
588 self.child_items_builder.add_item(item_type_index);
589 self.child_items_builder
590 }
591
592 fn record(mut self) -> WitValueChildItemsBuilder<WitValueItemBuilder<ParentBuilder>> {
593 let target_idx = self.parent_builder().add_record();
594 self.child_items_builder.add_item(target_idx);
595 WitValueChildItemsBuilder::new(self, target_idx)
596 }
597
598 fn variant(
599 mut self,
600 case_idx: u32,
601 ) -> WitValueChildBuilder<WitValueItemBuilder<ParentBuilder>> {
602 let variant_idx = self.parent_builder().add_variant(case_idx, -1);
603 self.child_items_builder.add_item(variant_idx);
604 WitValueChildBuilder {
605 builder: self,
606 target_idx: variant_idx,
607 }
608 }
609
610 fn variant_unit(mut self, case_idx: u32) -> Self::Result {
611 let variant_idx = self.parent_builder().add_variant_unit(case_idx);
612 self.child_items_builder.add_item(variant_idx);
613 self.child_items_builder
614 }
615
616 fn tuple(mut self) -> WitValueChildItemsBuilder<Self> {
617 let target_idx = self.parent_builder().add_tuple();
618 self.child_items_builder.add_item(target_idx);
619 WitValueChildItemsBuilder::new(self, target_idx)
620 }
621
622 fn list(mut self) -> WitValueChildItemsBuilder<Self> {
623 let target_idx = self.parent_builder().add_list();
624 self.child_items_builder.add_item(target_idx);
625 WitValueChildItemsBuilder::new(self, target_idx)
626 }
627
628 fn option_some(mut self) -> WitValueChildBuilder<Self> {
629 let option_idx = self.parent_builder().add_option_some();
630 self.child_items_builder.add_item(option_idx);
631 WitValueChildBuilder {
632 builder: self,
633 target_idx: option_idx,
634 }
635 }
636
637 fn option_none(mut self) -> Self::Result {
638 let option_idx = self.parent_builder().add_option_none();
639 self.child_items_builder.add_item(option_idx);
640 self.child_items_builder
641 }
642
643 fn result_ok(mut self) -> WitValueChildBuilder<Self> {
644 let result_idx = self.parent_builder().add_result_ok();
645 self.child_items_builder.add_item(result_idx);
646 WitValueChildBuilder {
647 builder: self,
648 target_idx: result_idx,
649 }
650 }
651
652 fn result_ok_unit(mut self) -> Self::Result {
653 let result_idx = self.parent_builder().add_result_ok_unit();
654 self.child_items_builder.add_item(result_idx);
655 self.child_items_builder
656 }
657
658 fn result_err(mut self) -> WitValueChildBuilder<Self> {
659 let result_idx = self.parent_builder().add_result_err();
660 self.child_items_builder.add_item(result_idx);
661 WitValueChildBuilder {
662 builder: self,
663 target_idx: result_idx,
664 }
665 }
666
667 fn result_err_unit(mut self) -> Self::Result {
668 let result_idx = self.parent_builder().add_result_err_unit();
669 self.child_items_builder.add_item(result_idx);
670 self.child_items_builder
671 }
672
673 fn handle(mut self, uri: Uri, handle_value: u64) -> Self::Result {
674 let item_type_index = self.parent_builder().add_handle(uri, handle_value);
675 self.child_items_builder.add_item(item_type_index);
676 self.child_items_builder
677 }
678
679 fn finish(self) -> Self::Result {
680 self.child_items_builder
681 }
682}
683
684pub struct WitValueChildBuilder<ParentBuilder: NodeBuilder> {
685 builder: ParentBuilder,
686 target_idx: NodeIndex,
687}
688
689impl<ParentBuilder: NodeBuilder> NodeBuilder for WitValueChildBuilder<ParentBuilder> {
690 type Result = ParentBuilder;
691
692 fn parent_builder(&mut self) -> &mut WitValueBuilder {
693 self.builder.parent_builder()
694 }
695
696 fn u8(mut self, value: u8) -> Self::Result {
697 let child_index = self.parent_builder().add_u8(value);
698 let target_idx = self.target_idx;
699 self.parent_builder().finish_child(child_index, target_idx);
700 self.builder
701 }
702
703 fn u16(mut self, value: u16) -> Self::Result {
704 let child_index = self.parent_builder().add_u16(value);
705 let target_idx = self.target_idx;
706 self.parent_builder().finish_child(child_index, target_idx);
707 self.builder
708 }
709
710 fn u32(mut self, value: u32) -> Self::Result {
711 let child_index = self.parent_builder().add_u32(value);
712 let target_idx = self.target_idx;
713 self.parent_builder().finish_child(child_index, target_idx);
714 self.builder
715 }
716
717 fn u64(mut self, value: u64) -> Self::Result {
718 let child_index = self.parent_builder().add_u64(value);
719 let target_idx = self.target_idx;
720 self.parent_builder().finish_child(child_index, target_idx);
721 self.builder
722 }
723
724 fn s8(mut self, value: i8) -> Self::Result {
725 let child_index = self.parent_builder().add_s8(value);
726 let target_idx = self.target_idx;
727 self.parent_builder().finish_child(child_index, target_idx);
728 self.builder
729 }
730
731 fn s16(mut self, value: i16) -> Self::Result {
732 let child_index = self.parent_builder().add_s16(value);
733 let target_idx = self.target_idx;
734 self.parent_builder().finish_child(child_index, target_idx);
735 self.builder
736 }
737
738 fn s32(mut self, value: i32) -> Self::Result {
739 let child_index = self.parent_builder().add_s32(value);
740 let target_idx = self.target_idx;
741 self.parent_builder().finish_child(child_index, target_idx);
742 self.builder
743 }
744
745 fn s64(mut self, value: i64) -> Self::Result {
746 let child_index = self.parent_builder().add_s64(value);
747 let target_idx = self.target_idx;
748 self.parent_builder().finish_child(child_index, target_idx);
749 self.builder
750 }
751
752 fn f32(mut self, value: f32) -> Self::Result {
753 let child_index = self.parent_builder().add_f32(value);
754 let target_idx = self.target_idx;
755 self.parent_builder().finish_child(child_index, target_idx);
756 self.builder
757 }
758
759 fn f64(mut self, value: f64) -> Self::Result {
760 let child_index = self.parent_builder().add_f64(value);
761 let target_idx = self.target_idx;
762 self.parent_builder().finish_child(child_index, target_idx);
763 self.builder
764 }
765
766 fn char(mut self, value: char) -> Self::Result {
767 let child_index = self.parent_builder().add_char(value);
768 let target_idx = self.target_idx;
769 self.parent_builder().finish_child(child_index, target_idx);
770 self.builder
771 }
772
773 fn bool(mut self, value: bool) -> Self::Result {
774 let child_index = self.parent_builder().add_bool(value);
775 let target_idx = self.target_idx;
776 self.parent_builder().finish_child(child_index, target_idx);
777 self.builder
778 }
779
780 fn string(mut self, value: &str) -> Self::Result {
781 let child_index = self.parent_builder().add_string(value);
782 let target_idx = self.target_idx;
783 self.parent_builder().finish_child(child_index, target_idx);
784 self.builder
785 }
786
787 fn enum_value(mut self, value: u32) -> Self::Result {
788 let child_index = self.parent_builder().add_enum_value(value);
789 let target_idx = self.target_idx;
790 self.parent_builder().finish_child(child_index, target_idx);
791 self.builder
792 }
793
794 fn flags(mut self, values: Vec<bool>) -> Self::Result {
795 let child_index = self.parent_builder().add_flags(values);
796 let target_idx = self.target_idx;
797 self.parent_builder().finish_child(child_index, target_idx);
798 self.builder
799 }
800
801 fn record(mut self) -> WitValueChildItemsBuilder<Self> {
802 let child_index = self.parent_builder().add_record();
803 let target_idx = self.target_idx;
804 self.parent_builder().finish_child(child_index, target_idx);
805 WitValueChildItemsBuilder::new(self, child_index)
806 }
807
808 fn variant(mut self, case_idx: u32) -> WitValueChildBuilder<Self> {
809 let variant_idx = self.parent_builder().add_variant(case_idx, -1);
810 let target_idx = self.target_idx;
811 self.parent_builder().finish_child(variant_idx, target_idx);
812 WitValueChildBuilder {
813 builder: self,
814 target_idx: variant_idx,
815 }
816 }
817
818 fn variant_unit(mut self, case_idx: u32) -> Self::Result {
819 let variant_idx = self.parent_builder().add_variant_unit(case_idx);
820 let target_idx = self.target_idx;
821 self.parent_builder().finish_child(variant_idx, target_idx);
822 self.builder
823 }
824
825 fn tuple(mut self) -> WitValueChildItemsBuilder<Self> {
826 let tuple_idx = self.parent_builder().add_tuple();
827 let target_idx = self.target_idx;
828 self.parent_builder().finish_child(tuple_idx, target_idx);
829 WitValueChildItemsBuilder::new(self, tuple_idx)
830 }
831
832 fn list(mut self) -> WitValueChildItemsBuilder<Self> {
833 let list_idx = self.parent_builder().add_list();
834 let target_idx = self.target_idx;
835 self.parent_builder().finish_child(list_idx, target_idx);
836 WitValueChildItemsBuilder::new(self, list_idx)
837 }
838
839 fn option_some(mut self) -> WitValueChildBuilder<Self> {
840 let option_idx = self.parent_builder().add_option_some();
841 let target_idx = self.target_idx;
842 self.parent_builder().finish_child(option_idx, target_idx);
843 WitValueChildBuilder {
844 builder: self,
845 target_idx: option_idx,
846 }
847 }
848
849 fn option_none(mut self) -> Self::Result {
850 let option_idx = self.parent_builder().add_option_none();
851 let target_idx = self.target_idx;
852 self.parent_builder().finish_child(option_idx, target_idx);
853 self.builder
854 }
855
856 fn result_ok(mut self) -> WitValueChildBuilder<Self> {
857 let result_idx = self.parent_builder().add_result_ok();
858 let target_idx = self.target_idx;
859 self.parent_builder().finish_child(result_idx, target_idx);
860 WitValueChildBuilder {
861 builder: self,
862 target_idx: result_idx,
863 }
864 }
865
866 fn result_ok_unit(mut self) -> Self::Result {
867 let result_idx = self.parent_builder().add_result_ok_unit();
868 let target_idx = self.target_idx;
869 self.parent_builder().finish_child(result_idx, target_idx);
870 self.builder
871 }
872
873 fn result_err(mut self) -> WitValueChildBuilder<Self> {
874 let result_idx = self.parent_builder().add_result_err();
875 let target_idx = self.target_idx;
876 self.parent_builder().finish_child(result_idx, target_idx);
877 WitValueChildBuilder {
878 builder: self,
879 target_idx: result_idx,
880 }
881 }
882
883 fn result_err_unit(mut self) -> Self::Result {
884 let result_idx = self.parent_builder().add_result_err_unit();
885 let target_idx = self.target_idx;
886 self.parent_builder().finish_child(result_idx, target_idx);
887 self.builder
888 }
889
890 fn handle(mut self, uri: Uri, handle_value: u64) -> Self::Result {
891 let child_index = self.parent_builder().add_handle(uri, handle_value);
892 let target_idx = self.target_idx;
893 self.parent_builder().finish_child(child_index, target_idx);
894 self.builder
895 }
896
897 fn finish(self) -> Self::Result {
898 self.builder
899 }
900}
901
902#[cfg(test)]
903mod tests {
904 use test_r::test;
905
906 use crate::{NodeBuilder, Value, WitValue, WitValueBuilderExtensions};
907
908 #[test]
909 fn primitive() {
910 let wit_value = WitValue::builder().u64(11);
911 let value: Value = wit_value.into();
912 assert_eq!(value, Value::U64(11));
913 }
914
915 #[test]
916 fn single_record() {
917 let wit_value = WitValue::builder()
918 .record()
919 .item()
920 .u8(1)
921 .item()
922 .enum_value(2)
923 .item()
924 .flags(vec![true, false, true])
925 .finish();
926 let value: Value = wit_value.into();
927 assert_eq!(
928 value,
929 Value::Record(vec![
930 Value::U8(1),
931 Value::Enum(2),
932 Value::Flags(vec![true, false, true]),
933 ])
934 );
935 }
936
937 #[test]
938 fn deep_record() {
939 let wit_value = WitValue::builder()
940 .record()
941 .item()
942 .list()
943 .item()
944 .record()
945 .item()
946 .s32(10)
947 .item()
948 .s32(-11)
949 .finish()
950 .item()
951 .record()
952 .item()
953 .s32(100)
954 .item()
955 .s32(200)
956 .finish()
957 .finish()
958 .finish();
959 let value: Value = wit_value.into();
960 assert_eq!(
961 value,
962 Value::Record(vec![Value::List(vec![
963 Value::Record(vec![Value::S32(10), Value::S32(-11)]),
964 Value::Record(vec![Value::S32(100), Value::S32(200)]),
965 ]),])
966 );
967 }
968
969 #[test]
970 fn option() {
971 let wit_value = WitValue::builder()
972 .option_some()
973 .option_some()
974 .option_none()
975 .finish()
976 .finish();
977 let value: Value = wit_value.into();
978 assert_eq!(
979 value,
980 Value::Option(Some(Box::new(Value::Option(Some(Box::new(
981 Value::Option(None)
982 ))))))
983 );
984 }
985}